最小生成树
题目大意:给出n个村庄直接的道路权值,让求出连接所有村庄的权值的最小值。
注意判断一下村庄不连通的情况就行了。
#include <cstdio>
#include <cstring>
#include <iostream>
#define MAX 105
#define INF 999999999
using namespace std;
bool s[MAX];
int map[MAX][MAX],dist[MAX];
void init(int n)
{
int i,j;
memset(s,false,sizeof(s));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=INF;
for(i=1;i<=n;i++)
map[i][i]=0;
}
int Prime(int n)
{
int i,j,k,mind,sum;
for(i=1;i<=n;i++)
dist[i]=map[1][i];
s[1]=true;
sum=0;
for(i=1;i<=n-1;i++)
{
mind=INF;
for(j=1;j<=n;j++)
if(!s[j]&&dist[j]<mind)
{
mind=dist[j];
k=j;
}
if(mind==INF) return 0;//如果村庄不连通,则跳出
s[k]=true;
sum+=dist[k];
for(j=1;j<=n;j++)
if(!s[j]&&dist[j]>map[k][j])
dist[j]=map[k][j];
}
return sum;
}
int main()
{
int n,m,tmp;
while(scanf("%d%d",&m,&n)&&m)
{
init(n);
int a,b,x;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&x);
map[a][b]=map[b][a]=x;
}
tmp=Prime(n);
if(tmp) printf("%d\n",tmp);
else printf("?\n");
}
return 0;
}