某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
当N为0时,输入结束,该用例不被处理。
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
3 5
prim代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int inf=0x3f3f;
int map[101][101],dis[101],book[101];
int main()
{
int m;
while(cin>>m)
{
if(m==0) break;
memset(book,0,sizeof(book));
int n=m*(m-1)/2;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
if(i==j) map[i][j]=0;
else map[i][j]=inf;
}
}
int a,b,c;
for(int i=1;i<=n;i++)
{
cin>>a>>b>>c;
map[a][b]=c;
map[b][a]=c;
}
for(int i=1;i<=m;i++)
dis[i]=map[1][i];
int cont=1,ans=0,u;
book[1]=1;
while(cont<m)
{
int minn=inf;
for(int i=1;i<=m;i++)
{
if(minn>dis[i]&&!book[i])
{
minn=dis[i];
u=i;
}
}
book[u]=1;
ans+=dis[u];
cont++;
for(int j=1;j<=m;j++)
{
if(!book[j]&&dis[j]>map[u][j])
dis[j]=map[u][j];
}
}
cout<<ans<<endl;
}
return 0;
}