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; }
相关文章推荐
- 冲刺第二天
- Xcode7 IOS 项目协作开发遇到apple push notification 提示开发者权限enrolled需求提示
- java IM基础(一):建立tcp连接
- 汇编指令实现计算2的4次方
- arm9+linux fl2440 GPRS SIM卡 模块 ppp拨号上网
- 反思
- 南京理工大学第八届程序设计大赛(校外镜像) F sequence
- 区间DP入门之 石子归并问题
- UVA-111 History Grading
- c++第4次作业
- POJ 3061 Subsequence
- eclipse配置red5服务器
- 为啥要用kmp算法,有什么依据嘛
- java 读取配置文件的几种方法
- poj2594(DAG最小路径覆盖)
- C++流操作算子
- 【BZOJ1758】【Wc2010】重建计划 树的点分治 二分
- android 小鱼在水中游
- OpenCv学习笔记(一)----OpenCv中Mat类源码的详细解读(2)
- 实验6 在应用程序中播放音频和视频