题意:第一行给出m,n。接下来m行每行三个数u v s表示从u到v的权值。算出把n个数连起来权值最小的值‘
思路:krustal算法,照着模板就行,注意讨论根是否走过,总之不太熟。
感悟:真是一点小错误也不敢有啊。
AC代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int bin[10010];
struct p{
int s;
int e;
int v;
}q[100010];
bool flag[10010];
bool cmp(p a,p b)
{
return a.v>b.v;
}
int find(int x)
{
if(x!=bin[x])
bin[x]=find(bin[x]);
return bin[x];
}
int main()
{
int n,m,i,x,y;
while(scanf("%d%d",&n,&m),n|m)
{
for(i=0;i<m;i++)
scanf("%d%d%d",&q[i].s,&q[i].e,&q[i].v);
sort(q,q+m,cmp);
int res=0;
for(i=0;i<n;i++)
bin[i]=i,flag[i]=false;
for(i=0;i<m;i++)
{
x=find(q[i].s);
y=find(q[i].e);
if(x!=y){
if(!flag[x]&&!flag[y]){
bin[x]=y;
res+=q[i].v;
}
else if(!flag[x]||!flag[y]){
bin[x]=y;
res+=q[i].v;
flag[x]=flag[y]=true;
}
}
else{
if(!flag[x]){
flag[x]=true;
res+=q[i].v;
}
}
}
printf("%d\n",res);
}
return 0;
}