但是kruskal的源码需要修改下……代码给的不好
kruskal:
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#define N 150
using namespace std;
int m,n,u[N],v[N],w[N],p[N],r[N];
//r是边的编号
//p是点的祖先点(便于判断是否在同一连通图)
int cmp(const int i,const int j)
{
return w[i]<w[j];
}
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
int kruskal()
{
int cou=0,x,y,i,ans=0;
for(i=0; i<n; i++) p[i]=i;
for(i=0; i<m; i++) r[i]=i;
sort(r,r+m,cmp);
for(i=0; i<m; i++)
{
int e=r[i];
x=find(u[e]);
y=find(v[e]);
if(x!=y)
{
ans += w[e];
p[x]=y;
cou++;
}
}
if(cou<n-1) ans=0;
return ans;
}
int main()
{
int i,ans;
while(scanf("%d%d",&m,&n)!=EOF&&m)
{
for(i=0; i<m; i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
}
ans=kruskal();
if(ans) printf("%d\n",ans);
else printf("?\n",ans);
}
return 0;
}