题目出处(http://pat.zju.edu.cn/contests/pat-a-practise/1034)这题主要意思是找到一组中最大的一个人的点的权重,开始的时候想用并查集去做,用并查集这样去做呢?用并查集怎样保存最大的那个权?,最后又怎样输出最大的权?也没有想出具体的方法,后来在网上搜了一下,可以用dfs或者bfs去做比较简单,此时,又遇到了一个问题怎样来处理字符串的问题?字符串用什么保存?对于C++的还有还很多知识没有学好,应该赶紧去学学,所以照着别人的代码写了一下主要是用map来处理这个比较复杂的字符串问题,此时的map有几点需要注意:1、要得到map里面的key值可以用先声明一个指向map的指针it,然后用it->first就可以得到键值了;2、map里面的key值是按由小到大的顺序排列的,所以不用再去排序什么的了;具体代码如下:
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<string>
using namespace std;
map<string,int> weight; //每个点的权重
map<string,vector<string> > adj; //邻接表
map<string,int> visited; //是否访问过
map<string,int> res; //存放结果
int num,total_w;
int N,K;
string head;
void dfs(string s)
{
visited[s] = 1;
num += 1;
total_w += weight[s];
if(weight[s] > weight[head])head = s;
for(vector<string>::iterator it = adj[s].begin();it != adj[s].end();it++)
{
if(visited[*it] == 0)dfs(*it);
}
}
int main()
{
int i,t;
string name1,name2;
cin>>N>>K;
for(i = 0;i < N;i++)
{
cin>>name1>>name2>>t;
adj[name1].push_back(name2);
adj[name2].push_back(name1);
weight[name1] += t;
weight[name2] += t;
visited[name1] = 0;
visited[name2] = 0;
}
for(map<string,int>::iterator it = visited.begin();it != visited.end();it++)
{
if(visited[it->first] == 0)
{
num = 0;
total_w = 0;
head = it->first;
dfs(it->first);
if(num > 2 && total_w/2 > K)res[head] = num;
}
}
//cout<<"flag"<<endl;
cout<<res.size()<<endl;
for(map<string,int>::iterator it1 = res.begin();it1 != res.end();it1++)
{
cout<<it1->first<<" "<<it1->second<<endl;
}
return 0;
}