题目链接:http://poj.org/problem?id=1287
题意:输入N,M N表示顶点数目 ,M表示边数
下面M行每行输入起点、终点、权值
直接套用Kruskal算法
#include<cstdio>
#include<algorithm>
const int N=10000;
int parent[N];
struct Edge
{
int s,e,dis;
bool operator<(const Edge &b)const{
return dis<b.dis;
}
}edge[N];
int find(int x){
return x==parent[x]?x:find(parent[x]);
}
int kruskal(int n)
{
int ans=0;
for(int i=0;i<N;++i)parent[i]=i;
std::sort(edge,edge+n);
for(int i=0;i<n;++i){
int x=find(edge[i].s);
int y=find(edge[i].e);
if(x!=y){
ans+=edge[i].dis;
parent[y]=x;
}
}
return ans;
}
int main()
{
int n,v,dis,s,e;
while(scanf("%d",&v),v){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d %d %d",&s,&e,&dis);
edge[i].s=s,edge[i].e=e,edge[i].dis=dis;
}
printf("%d\n",kruskal(n));
}
}