同样是一道最小生成树的题,注意连接两个节点的边可能不止一条,在读入数据的时候保留权重最小的边即可。
#include<iostream>
#include<string>
using namespace std;
int p,r;
int map[60][60];
int prim(){
int i,j,k;
int sum=0,min;
int dis[60],vis[60];
memset(vis,0,sizeof(vis));
vis[1]=1;
for(i=1;i<=p;i++)
dis[i]=map[1][i];
for(i=1;i<p;i++){
min=10000;
for(j=1;j<=p;j++)
if(!vis[j]&&dis[j]<min)
{
min=dis[j];
k=j;
}
vis[k]=1;
sum+=dis[k];
for(j=1;j<=p;j++){
if(!vis[j]&&map[j][k]<dis[j])
dis[j]=map[j][k];
}
}
return sum;
}
int main(){
int i,t,k,x,y;
while(scanf("%d",&p)&&p){
cin>>r;
memset(map,20000,sizeof(map));
for(i=0;i<r;i++){
cin>>x>>y>>k;
if(k<map[x][y])
map[x][y]=map[y][x]=k;
}
cout<<prim()<<endl;
}
return 0;
}