#include<iostream>
using namespace std;
#define N 9999999
int map[101][101];
int mark[101];
bool visited[101];
int n,m;
void prim()
{
int i,j,k,sum=0,min;
int flag=1;
memset(mark,0,sizeof(mark));
memset(visited,0,sizeof(visited));
k=1;
visited[1]=1;
for(i=2;i<=n;i++)
mark[i]=map[k][i];
min=N;
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n;j++)
if(mark[j]<min && !visited[j])
{
min=mark[j];
k=j;
}
if(min==N)
{
flag=0;
break;
}
visited[k]=1;
for(j=1;j<=n;j++)
{
if(mark[j]>map[k][j]&&!visited[j])
mark[j]=map[k][j];
}
sum+=min;
min=N;
}
if(flag)
printf("%d\n",sum);
else
printf("?\n");
}
int main()
{
int i,j;
int a,b,s;
while(cin>>m>>n)
{
if(m==0)
break;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=N;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&s);
map[a][b]=s;
map[b][a]=s;
}
prim();
}
return 0;
}
HDU 1863
最新推荐文章于 2020-10-20 17:15:26 发布