pat 1034 Head of a Gang

来源:互联网 发布:淘宝卖家服务热线 编辑:程序博客网 时间:2024/05/02 06:34

题意是要求总共有几个集合,每个集合权重最大的是哪个,以及每个集合中结点个数。一开始老想用并查集来做,发现实现起来很困难。参考网上代码,发现可以用DFS遍历,数出每个分支的结点个数。其中map的迭代器的使用得注意。还有,若一个gang中同时有多个相同的最大值,取字母序最小的。虽然不加这点,也能过,但为了健壮性,加上吧。

 

AC代码:

#include<iostream>#include<algorithm>#include<string>#include<vector>#include<map>using namespace std;map<string, vector<string> > adj;//邻接表map<string, int> weight;//各点权重map<string, int> visit;//是否访问过map<string, int> ans;//最后要输出的结果int cnt,totalweight;string head;void dfs(string str){visit[str]=1;cnt++;//该集合中结点个数totalweight+=weight[str];if(weight[str]>weight[head])head=str;else if(weight[str]==weight[head]&&str<head)//这里得注意,若一个gang中同时有多个相同的最大值,取字母序最小的head=str;for(vector<string>::iterator it=adj[str].begin();it!=adj[str].end();it++){if(visit[*it]==0){dfs(*it);}}}int main(){int n,k,time;string name1,name2;//freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);cin>>n>>k;int i;for(i=0;i<n;i++){cin>>name1>>name2>>time;weight[name1]+=time;weight[name2]+=time;adj[name1].push_back(name2);adj[name2].push_back(name1);visit[name1]=0;visit[name2]=0;}for(map<string, int >::iterator it=visit.begin();it!=visit.end();it++){if(visit[it->first]==0){cnt=0;//该集合中结点个数totalweight=0;//该集合总权重head=it->first;dfs(it->first);if(cnt>2 && totalweight/2 > k)//满足条件则登记ans[head]=cnt;}}cout<<ans.size()<<endl;for(map<string,int>::iterator iter=ans.begin();iter!=ans.end();iter++){cout<<iter->first<<" "<<iter->second<<endl;}return 0;}