您的位置:首页 > 其它

1034. Head of a Gang (30)

2016-04-21 21:41 302 查看
#include<iostream>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>

using namespace std;

typedef struct {
int id;
int total;
}Node;

typedef struct {
string head;
int cnt;
}Answer;

map<string,int> nameid;//name->id
map<int,string> idname;//id->name
vector<Node> group[2000];//分组
vector<Answer> ans;//answer集合
bool visited[2000];
int matrix[2000][2000];
int total[2000];
int idlen = 0;
int groupid = 0;

bool cmp1(Node n1,Node n2){
return n1.total > n2.total;
}

bool cmp2(Answer a1,Answer a2){
return a1.head < a2.head;
}

int findNameId(string name){//根据name查找ID
map<string,int>::iterator iter = nameid.find(name);
if(iter != nameid.end()){
return iter->second;
}
return -1;
}

queue<int> bfs;

int getTotal(int index){
int sum = 0;
for(int i = 0; i < idlen;i++){
sum += matrix[i][index];
}
return sum;
}

void BFS(int head){//将所有的元素进行分组
visited[head] = true;
bfs.push(head);

while(!bfs.empty()){
int current = bfs.front();
bfs.pop();
Node node;
node.id = current;
node.total = getTotal(current);
total[groupid] += node.total;//计算该组的时间总数×2,注意这个地方计算的结果是2倍关系。
group[groupid].push_back(node);
for(int i = 0; i < idlen;i++){
if(matrix[current][i] > 0 && visited[i] == false){
bfs.push(i);
visited[i] = true;
}
}
}

}

int main(){
int N,K;
cin >> N >> K;
for(int i = 0; i < N;i++){
//输入数据
string name1,name2;
int id1,id2;
int length;
cin >> name1 >> name2 >> length;
//将name1,name2映射成id
id1 = findNameId(name1);
if(id1 == -1){
id1 = idlen++;
nameid[name1]=id1;
idname[id1]=name1;
}
id2 = findNameId(name2);
if(id2 == -1){
id2 = idlen++;
nameid[name2]=id2;
idname[id2]=name2;
}
//构建邻接矩阵
matrix[id1][id2] += length;
matrix[id2][id1] += length;
}

//    for(int i = 0; i < idlen;i++){
//        for(int j = 0; j < idlen; j++){
//            cout << matrix[i][j] << ' ';
//        }
//        cout << endl;
//    }

//通过宽度优先搜索,进行图的连通分量的个数的计算。
//groupid就表述连通分量的个数
for(int i = 0 ; i < idlen;i++){
if(visited[i] == false){
BFS(i);
groupid++;
}
}

//cout << groupid << endl;
for(int i = 0; i < groupid;i++){

if(group[i].size() <= 2){
continue;
}
//cout << "total=" << total[i] << endl;
if(total[i] <= K * 2){//因为前面的计算是2倍关系
continue;
}else{
//将满足条件的存入解的集合中
sort(group[i].begin(),group[i].end(),cmp1);
Node node = group[i][0];//get the head of the group
string name = idname[node.id];
Answer answer;
answer.head = name;
answer.cnt = group[i].size();
ans.push_back(answer);
}
}

int len = ans.size();
cout << len << endl;
sort(ans.begin(),ans.end(),cmp2);
for(int i = 0 ; i < len;i++){
cout << ans[i].head << ' ' << ans[i].cnt << endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: