题目链接:http://poj.org/problem?id=2421
最小生成树的变形,有的村庄已经连接了,就直接把他们的权值赋为0,一样的做最小生成树,Prim算法。
#include <stdio.h> #include <string.h> #define INF 0x3f3f3f3f int maps[105][105]; bool vis[105]; int dis[105]; int n; int Prim() { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) dis[i] = INF; int ans=0; dis[1] = 0; for(int i=1;i<=n;i++) { int tmp = INF,k=0; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<tmp) { tmp = dis[j]; k=j; } } vis[k] = true; ans+=tmp; for(int i=1;i<=n;i++) { if(!vis[i]&&dis[i]>maps[k][i]) dis[i] = maps[k][i]; } } return ans; } int main() { scanf("%d",&n); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%d",&maps[i][j]); int k; scanf("%d",&k); for(int i=0; i<k; i++) { int a,b; scanf("%d%d",&a,&b); maps[a][b]=maps[b][a] = 0; } printf("%d ",Prim()); return 0; }