题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863
题目大意:中文题目
解题思路:简单的最小生成树,用prim算法解决,不同的是,本题要求若不能联通所有村庄则输出“?”,只要在prim函数里加一个判断即可,若visit数组全部为true则全部村庄都可联通,若存在一个位置为false则无法联通全部村庄,需要输出“?”。
AC代码:
#include <iostream>
#include <string.h>
using namespace std;
#define INF 2000000
int prim(int matrix[105][105],int m)
{
int result=0;
bool visit[105];
int p[m];
for(int i=1;i<=m;i++)
p[i] = matrix[1][i];
memset(visit,0,sizeof(visit));
for(int i=1;i<=m;i++)
{
int min=INF;
int index;
for(int j=1;j<=m;j++)
{
if(p[j]<min&&visit[j]==0)
{
min = p[j];
index = j;
}
}
visit[index] = 1;
result+=p[index];
for(int j=1;j<=m;j++)
{
if(!visit[j])
p[j] = matrix[index][j]<p[j]?matrix[index][j]:p[j];
}
}
for(int i=1;i<=m;i++)
if(!visit[i])return INF;
return result;
}
int main()
{
int n,m;
int a,b,c;
int result;
int matrix[105][105];
while(cin>>n)
{
if(n==0)break;
cin>>m;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
matrix[i][j] = INF;
if(i==j)matrix[i][j] = 0;
}
}
for(int i=1;i<=n;i++)
{
cin>>a>>b>>c;
matrix[a][b] = matrix[b][a] = c;
}
result = prim(matrix,m);
if(result==INF)cout<<'?'<<endl;
else cout<<result<<endl;
}
return 0;
}