題目鏈接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66965#problem/B
思路:題意簡單,直接Prim求解。
代碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x7fffffff
using namespace std;
int Map[60][60],dis[60],vis[60];
int P,R;
void prim(){
memset(vis,0,sizeof(vis));
for(int i=0;i<=P;i++) dis[i]=Map[1][i];
int sum=0;vis[1]=1;
for(int p=1;p<=P-1;p++){
int Min=INF,t;
for(int i=1;i<=P;i++) if(!vis[i] && dis[i]<Min)
Min=dis[t=i];
sum+=Min;vis[t]=1;
for(int i=1;i<=P;i++) if(!vis[i] && dis[i]>Map[t][i])
dis[i]=Map[t][i];
}
cout<<sum<<endl;
}
int main(){
//freopen("D:\\in.txt","r",stdin);
while(cin>>P && P){
cin>>R;
for(int i=0;i<=P;i++) for(int j=0;j<=P;j++) Map[i][j]=INF;
int a,b,c;
for(int i=0;i<R;i++){
scanf("%d %d %d",&a,&b,&c);
Map[a][b]=Map[b][a]=min(Map[a][b],c);
}
prim();
}
return 0;
}