http://poj.org/problem?id=1258
又学到一个新的算法 最小生成树 本题用到prim算法
题意 有N个农场 农场之间要铺设光缆 为保持通信农场之间要互相链接 问最少要多少光缆
典型的最小生成树问题 但是 对于没有接触过最小生成树的初学者来说很容易和最短路的问题混淆 但是这里和最短路的思想并不一样
最短路求的是到达目的地的最短路径 而这里求的是相互连通的最短距离
AC代码:
#include <stdio.h>
#define maxinf 0x3f3f3f3f
int dis[110],vis[110];
int map[110][110];
int n;
void prim(){
int v;
for(int i=1;i<=n;i++){
dis[i]=map[1][i];
vis[i]=0;
}
vis[1]=1;
for(int i=1;i<=n;i++){
int min=maxinf;
for(int j=1;j<=n;j++)
if(!vis[j] && dis[j]<min){
min=dis[j];
v=j;
}
vis[v]=1;
for(int j=1;j<=n;j++)
if(!vis[j] && dis[j]>map[v][j])
dis[j]=map[v][j];
}
}
int main(){
int i,j;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
prim();
int sum=0;
for (int i=1;i<=n;i++){
sum+=dis[i];
}
printf ("%d\n",sum);
}
return 0;
}