总是感觉最小生成树和并查集是混着用的 用的是prim算法 注意的点是因为初始化的缘故 所以第一次的for循环没有=号 而第二次的for循环求最小的值是是需要加上=号的
# include <stdio.h>
# include <string.h>
# define INF 999999
int m,n;
int sum=0;
int lowcost[1000];
int nearvex[1000];
int map[1000][1000];
int prim(int u0)
{
int i,j;
int min,v;
sum =0;
for(i=1;i<=m;i++)
{
lowcost[i]=map[u0][i];
nearvex[i]=u0;
} //初始化
nearvex[u0]=-1;
for(i=1;i<m;i++)
{
min=INF;
v=-1;
for(j=1;j<=m;j++)
if(nearvex[j]!=-1&&lowcost[j]<min)
{
min=lowcost[j];
v=j;
}
if(v!=-1)
{
sum+=lowcost[v];
// printf("%d %d %d\n",nearvex[v],v,lowcost[v]);
nearvex[v]=-1;
for(j=1;j<=m;j++)
{
if(nearvex[j]!=-1&&map[v][j]<lowcost[j])
{
lowcost[j]=map[v][j];
nearvex[j]=v;
}
}
}
else if(v==-1)
{
return 1;
}
}
return 0;
}
int main()
{
int i,j,c;
int v,k,w;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0)
break;
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&v,&k,&w);
map[v][k]=map[k][v]=w;
}
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
{
if(0==map[i][j]) {map[i][j]=INF;}
if(i==j) {map[i][j]=0;}
}
c=prim(1);
if(c)
printf("?\n");
else
printf("%d\n",sum);
}//while的结束
return 0;
}