标签:
0
题目大意:N个村庄之间修路,有的路已经修了,有的路没有修。给你N个村庄间
修路的花费和修建状态,问:最少需要再花费多少钱能将N个村庄全部联通。
思路:已经修建过的路花费赋值为0,Prim算法求最小生成树。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int G[110][110],vis[110],low[110]; void Prim(int N) { memset(vis,0,sizeof(vis)); int ans = 0; vis[1] = 1; int pos = 1; for(int i = 1; i <= N; i++) { if(i != pos) low[i] = G[pos][i]; } for(int i = 1; i < N; i++) { int Min = 0xffffff0; for(int j = 1; j <= N; j++) { if(!vis[j] && low[j] < Min) { Min = low[j]; pos = j; } } ans += Min; vis[pos] = 1; for(int j = 1; j <= N; j++) { if(!vis[j] && low[j] > G[pos][j]) low[j] = G[pos][j]; } } printf("%d\n",ans); } int main() { int N,x,y,d,s; while(scanf("%d",&N) && N) { for(int i = 1; i <= N; i++) for(int j = 1; j <= N; j++) G[i][j] = 0xffffff0; for(int i = 0; i < N*(N-1)/2; i++) { scanf("%d%d%d%d",&x,&y,&d,&s); if(s == 0) G[x][y] = G[y][x] = d; else G[x][y] = G[y][x] = 0; } Prim(N); } return 0; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/42125173