#include <iostream>
#include <string.h>
#define INF 99999999
#define N 110
using namespace std;
int mp[N][N],low[N],vis[N];
int n,m;//n为边, m为点
int prim()
{
int i,j,pos=1,min;
int result=0;
memset(vis,0,sizeof(vis));
vis[pos]=1;
for(i=1;i<=m;i++)
low[i]=mp[pos][i];
for(i=1;i<m;i++)
{
min = INF;pos =-1;
for(j=1;j<=m;j++)
if( !vis[j] && min > low[j])
{
min=low[j];
pos=j;
}
if(pos == -1)
return -1;
result +=min;
vis[pos]=1;
for(j=1;j<=m;j++)
if( !vis[j] && j!= pos && low[j] >mp[pos][j])
low[j]=mp[pos][j];
}
return result;
}
int main()
{
int i,j;
int a,b,dis;
int ans;
while(cin>>n>>m,n)
{
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
mp[i][j]=INF;
mp[i][i] =0;
}
for(i=1;i<=n;i++)
{
cin>>a>>b>>dis;
if(mp[a][b] > dis)
mp[a][b]=mp[b][a] = dis;
}
ans = prim();
if(ans ==-1)
cout<<"?"<<endl;
else
cout<<ans<<endl;
}
return 0;
}
图论 生成树 HDU 1863 (prim)
最新推荐文章于 2019-07-17 14:38:01 发布