题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233
题目大意:中文题目
解题思路:简单的最小生成树问题,可以用Kruskal或者prim算法解决,这里用prim算法。
AC代码:
#include <iostream>
#include <string.h>
using namespace std;
#define INF 2000000
int prim(int matrix[105][105],int n)
{
bool visited[105];
int result=0;
int p[n];
for(int i=1;i<=n;i++)
{
p[i] = matrix[1][i];
}
memset(visited,0,sizeof(visited));
for(int i=1;i<=n;i++)
{
int min = INF;
int index=0;
for(int j=1;j<=n;j++)
{
if(p[j]<min&&visited[j]==0)
{
min = p[j];
index = j;
}
}
visited[index] = 1;
result+=p[index];
for(int j=1;j<=n;j++)
{
if(!visited[j])p[j] = matrix[index][j]<p[j]?matrix[index][j]:p[j];
}
}
return result;
}
int main()
{
int n;
int count;
int a,b,c;
int matrix[105][105];
while(cin>>n)
{
if(n==0)break;
count=(n-1)*n/2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
matrix[i][j] = INF;
if(i==j)matrix[i][j] = 0;
}
}
for(int i=1;i<=count;i++)
{
cin>>a>>b>>c;
matrix[a][b] = matrix[b][a] = c;
}
if(n==1)cout<<0<<endl;
else cout<<prim(matrix,n)<<endl;
}
return 0;
}