标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5379 Accepted Submission(s): 3884
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int INF = 0x3f3f3f3f; 7 int father[30]; 8 int n, k; 9 struct node 10 { 11 int x, y, w; 12 } num[450]; 13 14 bool cmp(node x, node y) 15 { 16 return x.w < y.w; 17 } 18 19 void init() 20 { 21 for(int i = 0; i < n; i++) 22 father[i] = i; 23 } 24 25 int find(int a) 26 { 27 if(a == father[a]) 28 return a; 29 else 30 return father[a] = find(father[a]); 31 } 32 33 int mercy(int a, int b) 34 { 35 int q = find(a); 36 int p = find(b); 37 if(q != p) 38 { 39 father[q] = p; 40 return true; 41 } 42 else 43 return false; 44 } 45 46 void Deal() 47 { 48 k = 0; 49 int a, b, c, d; char str, ch; 50 for(int i = 1; i < n; i++) 51 { 52 //scanf("%c %d", str, a); 53 cin >> str >> a; 54 c = str - ‘A‘; 55 for(int j = 1; j <= a; j++) 56 { 57 cin >> ch >> b; 58 //scanf("%c %d", &ch, &b); 59 d = ch - ‘A‘; 60 num[k].x = c; num[k].y = d; num[k++].w = b; 61 } 62 } 63 } 64 int main() 65 { 66 while(~scanf("%d", &n), n) 67 { 68 init(); 69 Deal(); 70 sort(num, num + k, cmp); 71 int sum = 0; 72 for(int i = 0; i < k; i++) 73 if(mercy(num[i].x, num[i].y)) 74 sum += num[i].w; 75 printf("%d\n", sum); 76 77 } 78 return 0; 79 }
//Prime : 0ms
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 const int INF = 0x3f3f3f3f; 6 int map[30][30], dis[30]; bool vis[30]; 7 int n; 8 int Prim() 9 { 10 int sum = 0; 11 memset(vis, true, sizeof(vis)); 12 for(int i = 0; i < n; i++) 13 dis[i] = map[0][i]; 14 vis[0] = false; 15 for(int i = 1; i < n; i++) 16 { 17 int temp, min = INF; 18 for(int j = 0; j < n; j++) 19 { 20 if(vis[j] && dis[j] < min) 21 { 22 min = dis[j]; 23 temp = j; 24 } 25 } 26 vis[temp] = false; 27 sum += min; 28 for(int j = 0; j < n; j++) 29 { 30 if(vis[j] && dis[j] > map[temp][j]) 31 dis[j] = map[temp][j]; 32 } 33 } 34 return sum; 35 } 36 int main() 37 { 38 while(~scanf("%d", &n), n) 39 { 40 for(int i = 0; i < n; i++) 41 for(int j = 0; j < n; j++) 42 map[i][j]=(i==j?0:INF); 43 int a, b, c, d; char str, ch; 44 for(int i = 1; i < n; i++) 45 { 46 cin >> str >> a; 47 c = str - ‘A‘; 48 for(int j = 1; j <= a; j++) 49 { 50 cin >> ch >> b; 51 d = ch - ‘A‘; 52 if(map[c][d] > b) 53 map[c][d]=map[d][c]=b; 54 } 55 } 56 printf("%d\n", Prim()); 57 } 58 return 0; 59 }
标签:
原文地址:http://www.cnblogs.com/fengshun/p/4721304.html