Problem Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
Output
每组输出占一行,仅输出最小花费。
Sample Input
3 2 1 2 1 1 3 1 1 0
Sample Output
2 0
题解:我们讲输入的边按花费从大到小排序,逐步寻找n-1条最小边。
#include<bits/stdc++.h>
using namespace std;
const int maxn=11111;
int f[maxn];
int n,m,cnt,ans;
struct Edge
{
int u,v,w;
}e[maxn];
int cmp(Edge a,Edge b)
{
return a.w<b.w;
}
int getf(int v)
{
return f[v]==v?v:f[v]=getf(f[v]);
}
int merge_(int u,int v)
{
int t1=getf(u);
int t2=getf(v);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
return 0;
}
int main()
{
while(cin>>n>>m)
{
ans=cnt=0;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
e[i]=(Edge){u,v,w};
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;i++)
{
int x=merge_(e[i].u,e[i].v);
if(x)
{
ans+=e[i].w;
cnt++;
}
if(cnt==n-1)
break;
}
cout<<ans<<endl;
}
return 0;
}
/***************************************************
User name: ACM18171信科1801张林
Result: Accepted
Take time: 44ms
Take Memory: 288KB
Submit time: 2019-02-15 14:33:23
****************************************************/