Jungle Roads
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5379 Accepted Submission(s): 3884
Problem Description
Sample Input
9
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
3
A 2 B 10 C 40
B 1 C 20
0
Sample Output
216
30
Source
Recommend
Eddy | We have carefully selected several similar problems for you:
//克鲁斯卡尔:
1 #include2 #include 3 #include 4 #include 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 else30 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 else43 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 #include2 #include 3 #include 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 }