行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main()
{ int n,m,i,min,j,sum;
int r[133][133],b[133];
while(scanf("%d%d",&n,&m),n)
{
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
r[i][j]=0xfffffff;
memset(b,0,sizeof(b));
for(i=0;i<n;i++)
{
scanf("%d%d%d",&j,&min,&sum);
r[min][j]=r[j][min]=sum<r[min][j]?sum:r[min][j];
}
i=n+1-m;//开始时这里判断错误,错的好惨
if(i<0)
{
printf("?\n");
continue;
}
b[1]=1;
n=m-1; sum=0;
while(n--)
{ min=0xffffff;
for(i=2;i<=m;i++)
if(!b[i]&&r[1][i]<min)
{
min=r[1][i];
j=i;
}
if(min==0xffffff)
break;
b[j]=1;
sum+=min;
for(i=2;i<=m;i++)
if(!b[i]&&r[j][i]<r[1][i])
r[1][i]=r[j][i];
}
if(min==0xffffff)
printf("?\n");
else
printf("%d\n",sum);
}
return 0;
}