题目地址:
http://poj.org/problem?id=1287
最小生成树的模板题,不过要注意的是两条路之间可能不只有一条唯一的路,这里,选一条最小的路就行了。
代码:
//模板题
//但是在两条路径之中可以有多个边
//取最小的
#include <iostream>
#include<cstring>
using namespace std;
#define MAX 51
#define INF 9999999
int map[MAX][MAX];
int micost[MAX];
bool vis[MAX];
int N,M;
void Prim()
{
int ans,i,j,v,Min;
for(i=1;i<=N;i++)
{
vis[i]=0;
micost[i]=map[1][i];
}
ans=0;
micost[1]=0;
vis[1]=1;
if(N==1){
cout<<0<<endl;
return;
}
for(i=2;i<=N;i++)
{
Min=INF;
for(j=2;j<=N;j++){
if(!vis[j]&&Min>micost[j]){
Min=micost[j];
v=j;
}
}
if(Min==INF)break;
else{
ans=ans+Min;
vis[v]=1;
}
for(j=2;j<=N;j++)
{
if(!vis[j]&&micost[j]>map[v][j])
micost[j]=map[v][j];
}
}
cout<<ans<<endl;
}
int main()
{
int i,j,a,b,c;
while(cin>>N,N)
{
cin>>M;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(i==j)map[i][j]=0;
else
map[i][j]=INF;
}//初始化
for(i=1;i<=M;i++)
{
cin>>a>>b>>c;
if(map[a][b]>c)
map[a][b]=map[b][a]=c;//取最小的
}//输入
Prim();
}
return 0;
}