题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1879
题目大意:
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。
当N为0时输入结束。
解题思路:
对于已经建好的路径,路径权值设置成0,然后就直接求MST即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 100 + 10; 5 const int INF = 0x3f3f3f3f; 6 int Map[maxn][maxn]; 7 int lowcost[maxn]; 8 int mst[maxn]; 9 int n, m; 10 void prim(int u) 11 { 12 int ans = 0; 13 for(int i = 1; i <= n; i++) 14 { 15 lowcost[i] = Map[u][i]; 16 mst[i] = u; 17 } 18 mst[u] = -1; 19 for(int i = 1; i < n; i++) 20 { 21 int minn = INF; 22 int v = -1; 23 //寻找lowcost数组里面的未加入mst的最小值 24 for(int j = 1; j <= n; j++) 25 { 26 if(mst[j] != -1 && lowcost[j] < minn) 27 { 28 v = j; 29 minn = lowcost[j]; 30 } 31 } 32 if(v != -1) 33 { 34 mst[v] = -1; 35 ans += lowcost[v]; 36 for(int j = 1; j <= n; j++) 37 { 38 if(mst[j] != -1 && lowcost[j] > Map[v][j]) 39 { 40 lowcost[j] = Map[v][j]; 41 mst[j] = v; 42 } 43 } 44 } 45 } 46 cout<<ans<<endl; 47 } 48 49 int main() 50 { 51 while(scanf("%d", &n) != EOF && n) 52 { 53 memset(Map, INF, sizeof(Map)); 54 memset(lowcost, 0, sizeof(lowcost)); 55 m = n * (n - 1) / 2; 56 int x, y, d, t; 57 while(m--) 58 { 59 scanf("%d%d%d%d", &x, &y, &d, &t); 60 if(!t)Map[x][y] = Map[y][x] = d; 61 else Map[x][y] = Map[y][x] = 0; 62 } 63 prim(1); 64 } 65 return 0; 66 }