#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int m,n,g[200][200],d[200];
bool v[200];
int prim()
{
int i,j,k,min,s=0;
for(i=1;i<=m;i++)
{
d[i]=g[1][i];
v[i]=0;
}
v[1]=1;
d[1]=0;
for(i=1;i<m;i++)
{
min=inf,k=-1;
for(j=1;j<=m;j++)
{
if(!v[j]&&d[j]<min)
{
min=d[j];
k=j;
}
}
if(k==-1) return -1;
s+=min;
v[k]=1;
for(j=1;j<=m;j++)
{
if(!v[j]&&d[j]>g[k][j])//如果可通过点k更近到达
d[j]=g[k][j];
}
}
return s;//树总长
}
int main()
{
int i,j,a,b,w,ans;
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
if(i==j) g[i][j]=0;
else g[i][j]=inf;
while(n--)
{
scanf("%d%d%d",&a,&b,&w);
if(w<g[a][b])
g[a][b]=g[b][a]=w;
}
ans=prim();
if(ans==-1) printf("?\n");
else printf("%d\n",ans);
}
return 0;
}
prim最小生成树
最新推荐文章于 2024-02-15 20:50:29 发布