题意:输入n行每行代表第n个村庄分别与其它村庄的距离,求联系每个村庄的最小距离.
这道题完全可以当做prim算法的模板去写POJ2421,POJ 1251,POJ 2560,POJ 1789,POJ 2485.
最小生成树关键在于建图。
#include<cstdio>
#include<cstring>
#define M 210
#define INF 0x3f3f3f3f
int map[M][M],low[M],visit[M]; //low[i]是一个点到下一个点的最短距离
int prim(int n)
{
int pos,result = 0,i,j,min;
memset(visit,0,sizeof(visit));
visit[1] = 1,pos = 1;
for(i = 1;i <= n; i++)
if(i != pos)
low[i] = map[pos][i];
for(i = 1;i < n; i++){
min = INF;
for(j = 1;j <= n; j++)
if(visit[j] == 0 && min > low[j]){
min = low[j];
pos = j;
}
result += min;
visit[pos] = 1;
for(j = 1;j <= n; j++)
if(visit[j] == 0 && low[j] > map[pos][j])
low[j] = map[pos][j];
}
return result;
}
int main()
{
int n,p;
while(scanf("%d",&n) != EOF){
int i,j;
for(i = 1;i <= n; i++)
for(j = 1;j <= n; j++){
scanf("%d",&p);
map[i][j] = p;
}
printf("%d\n",prim(n));
}
return 0;
}