一道简单的最短路径问题,一次就过了。这是幸运啊
# include<stdio.h>
# include<string.h>
int eu[6000],ev[6000],ew[6000],id[6000],p[101];
void init(int n,int m)
{
int i;
for(i=0;i<n;i++)
id[i]=i;
for(i=1;i<=m;i++)
p[i]=i;
}
int cmp(const void *a,const void *b)
{
int c,d;
c=*((int *)a);
d=*((int *)b);
return ew[c]-ew[d];
}
int find(int x)
{
if(x!=p[x])
p[x]=find(p[x]);
return p[x];
}
int kruskal(int n,int m)
{
int i,j,k,ret=0;
init(n,m);
qsort(id,n,sizeof(id[0]),cmp);
for(i=1,j=-1;i<m;i++)
{
do
{
if(j>=n-1)
return -1;
k=id[++j];
}while(find(eu[k])==find(ev[k]));
ret+=ew[k];
p[find(eu[k])]=find(ev[k]);
}
return ret;
}
void main()
{
int n,m,i,t;
while(scanf("%d%d",&n,&m)&&n)
{
for(i=0;i<n;i++)
{
scanf("%d%d%d",&eu[i],&ev[i],&ew[i]);
}
if(n<(m-1))
printf("?\n");
else
{
t=kruskal(n,m);
if(t>=0)
printf("%d\n",t);
else
printf("?\n");
}
}
}