【HDU3371】Connect the Cities(MST基础题)
注意输入的数据分别是做什么的就好。还有,以下代码用C++交可以过,而且是500+ms,但是用g++就会TLE,很奇怪。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cmath> 6 #include <cctype> 7 #include <algorithm> 8 #include <numeric> 9 #include <limits.h> 10 11 #define typec int 12 using namespace std; 13 14 const typec inf = 0xffff; 15 const int V = 505; 16 int vis[V]; typec lowc[V]; 17 int Map[V][V]; 18 19 typec prim (typec cost[][V], int n) { 20 int i, j, p; 21 typec minc, res = 0; 22 memset(vis, 0, sizeof(vis)); 23 vis[0] = 1; 24 for (i = 1; i < n; ++ i) lowc[i] = cost[0][i]; 25 for (i = 1; i < n; ++ i) { 26 minc = inf; 27 p = -1; 28 for (j = 0; j < n; ++ j) { 29 if (0 == vis[j] && minc > lowc[j]) { 30 minc = lowc[j]; 31 p = j; 32 } 33 } 34 if (inf == minc) return -1; 35 res += minc; 36 vis[p] = 1; 37 for (j = 0; j < n; ++ j) { 38 if (0 == vis[j] && lowc[j] > cost[p][j]) { 39 lowc[j] = cost[p][j]; 40 } 41 } 42 } 43 return res; 44 } 45 46 47 int main () { 48 int n, road_n, union_n, T; 49 scanf("%d", &T); 50 while (T--) { 51 scanf("%d%d%d", &n, &road_n, &union_n); 52 //cout << "road_n : " << road_n << endl; 53 for (int i = 0; i < V; ++ i) { 54 for (int j = 0; j < V; ++ j) { 55 if (i == j) Map[i][j] = 0; 56 else Map[i][j] = inf; 57 } 58 } 59 60 for (int i = 0; i < road_n; ++ i) { 61 int x, y, w; 62 scanf("%d%d%d", &x, &y, &w); 63 Map[x - 1][y - 1] = Map[y - 1][x - 1] = min(Map[x - 1][y - 1], w); 64 65 } 66 /* 67 for (int i = 0 ; i < n; ++ i) { 68 for (int j = 0; j < n; ++ j) { 69 cout << Map[i][j] << "\t"; 70 } 71 cout << endl; 72 } 73 */ 74 for (int i = 0; i < union_n; ++ i) { 75 int xx, xx_n, last; 76 scanf("%d", &xx_n); 77 for (int j = 0; j < xx_n; ++ j) { 78 scanf("%d", &xx); 79 if (!j) { 80 last = xx; 81 continue; 82 } else { 83 Map[xx - 1][last - 1] = Map[last - 1][xx - 1] = 0; 84 last = xx; 85 } 86 } 87 } 88 89 printf("%d\n", prim(Map, n)); 90 } 91 return 0; 92 }