P1195 口袋的天空

P1195 口袋的天空


先将每个点看做一棵生成树

合并时生成树个数-1

#include<cstdio> 
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
	int point1;
	int point2;
	int weight;
};
node line[500000];
int f[10010];
int find(int x)
{
	if(f[x]==x)
		return x;
	return f[x]=find(f[x]);
}
bool compare(const node &a,const node &b)
{
	return a.weight<b.weight;
}
int main()
{
	int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++)
		f[i]=i;
	//int a,b,c;
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&line[i].point1,&line[i].point2,&line[i].weight);
	sort(line+1,line+1+m,compare);
	int sum=n;
	int i=1;
	int ans=0;
	while(sum>k&&i<=m)
	{
		int f1=find(line[i].point1),f2=find(line[i].point2);
		if(f1!=f2)
		{
			f[f1]=f2;
			ans+=line[i].weight;
			sum-=1;
		}
		i+=1;
	}
	if(sum==k)
		printf("%d",ans);
	else
		printf("No Answer");
	return 0;
}
/*
5 8 0
1 2 2
1 3 1
1 5 4
3 2 2
3 4 3
3 5 4
2 5 4
4 5 5
*/
posted @ 2018-04-03 11:28  Lance1ot  阅读(158)  评论(0编辑  收藏  举报