pat_1034

来源:互联网 发布:淘宝闲置物品怎么下架 编辑:程序博客网 时间:2024/05/18 13:24

题目出处(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;}