pat_1034

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值