kruskal参照小白书(虽然出了紫薯),函数主体:
int kruskal()
{
int i,ans=0;
for(i=0;i<m;i++)
Father[i]=i;
for(i=0;i<n;i++)
r[i]=i;
sort(r,r+n,cmp);
for(i=0;i<n;i++)
{
int e=r[i];
int x=finder(uu[e]);
int y=finder(vv[e]);
if(x!=y)
{
ans+=w[e];
sum+=1;
Father[x]=y;
}
}
return ans;
}
里面的sum,记录被选入最小生成树里的边个数~
/*
* Author: 风凌月影
* School: HZIEE
* Time : 2014-12-06-19.20
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1100;
int Father[maxn];
int uu[maxn],vv[maxn],w[maxn],r[maxn];
int n,m,sum;
int cmp(const int a,const int b)
{
return w[a]<w[b];
}
int finder (int x)
{
return x==Father[x]?x:Father[x] =finder(Father[x]);
}
int kruskal()
{
int i,ans=0;
for(i=0;i<m;i++)
Father[i]=i;
for(i=0;i<n;i++)
r[i]=i;
sort(r,r+n,cmp);
for(i=0;i<n;i++)
{
int e=r[i];
int x=finder(uu[e]);
int y=finder(vv[e]);
if(x!=y)
{
ans+=w[e];
sum+=1;
Father[x]=y;
}
}
return ans;
}
int main()
{
int i,j;
int u,v;
while(scanf("%d %d",&n,&m)&&n)
{
sum=0;
for(i=0;i<n;i++)
{
scanf("%d %d %d",&uu[i],&vv[i],&w[i]);
}
int ans=kruskal();
if(sum==m-1)
printf("%d\n",ans);
else
printf("?\n");
}
return 0;
}