pat 1034 Head of a Gang

題意是要求總共有幾個集合,每個集合權重最大的是哪個,以及每個集合中結點個數。一開始老想用並查集來做,發現實現起來很困難。參考網上代碼,發現可以用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;
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章