没有理由不对呀
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int cost[110][110];
int mincost[110];
bool used[110];
int sett[110];
int M;
int prim()
{
for(int i=0;i<=M;i++)
{
mincost[i]=2147483646;
used[i]=false;
}
mincost[1]=0;
int res=0;
while(true){
int v=-1;
for(int i=1;i<=M;i++) printf("%d ",mincost[i]);
for(int i=1;i<=M;i++)
if(!used[i] && (v==-1||mincost[i]<mincost[v])) v=i;
printf("v==%d\n",v);
if(v==-1) break;
used[v]=true;
res+=mincost[v];
for(int i=1;i<=M;i++)
{
mincost[i] = min(mincost[i],cost[v][i]);
}
}
return res;
}
int find2(int x)
{
while(x!=sett[x])
x=sett[x];
return x;
}
int main()
{
int N;
while(scanf("%d%d",&N,&M)&&N){
int flag=0;
for(int i=0;i<=M;i++) sett[i]=i;
while(N--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
cost[a][b]=c;
int fa = find2(a);
int fb = find2(b);
if(fa!=fb) sett[fa]=fb;
}
int coutt=0;
for(int i=1;i<=M;i++) if(sett[i]==i) coutt++;
if(coutt > 1) flag=1;
for(int i=1;i<=M;i++)
for(int j=1;j<=M;j++)
if(cost[i][j]==0) cost[i][j]= 2147483647;
for(int i=1;i<=M;i++){
for(int j=1;j<=M;j++)
printf("%d ",cost[i][j]);
printf("\n");
}
if(flag) printf("?\n");
else printf("%d\n",prim()) ;
}
return 0;
}