hdu 1301 Jungle Roads

还是一道差不多一样的最小生成树的题目,数据量本来也不大,Kruskal 算法直接过

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct edge
{
	int u,v,w;
	edge(int x=0,int y=0,int z=0):u(x),v(y),w(z){};
};
edge e[80];
int n,m,ans;
int f[30];
int find(int x)
{
	if(x==f[x]) return x;
	f[x]=find(f[x]);
	return f[x];
}
void Union(int x,int y,int z)
{
	int a=find(x);
	int b=find(y);
	if(a==b)
		return ;
	f[b]=a;
	ans+=z;
}
bool cmp(edge a,edge b)
{
	return a.w<b.w;
}
int main()
{
	int a,b; 
	char c1,c2;
	while(cin>>n&&n)
	{
		int num=0;
		for(int i=1;i<=n;i++)
			f[i]=i;
		for(int i=1;i<n;i++)
		{
			cin>>c1>>a;
			int t=c1-'A'+1;
			for(int j=0;j<a;j++)
			{
				cin>>c2>>b;
				e[num++]=edge(t,c2-'A'+1,b);
			}
		}
		sort(e,e+num,cmp);
		ans=0;
		for(int i=0;i<num;i++)
			Union(e[i].u,e[i].v,e[i].w);
		cout<<ans<<endl;

	}
	return 0;
}

				

  

原文地址:https://www.cnblogs.com/nanke/p/2141328.html