还是畅通工程(浙大上机2006)
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
Sample Output
3
5
其实就是求最小生成树,可是我竟把Prim算法和Dijkstra算法给弄混了,笨呢:
View Code
1 #include <iostream>
2 #include <fstream>
3 #include <cstring>
4
5 using namespace std;
6
7 #define N 100
8 #define NN 5050
9 #define INF 0x7f
10
11 int lowest[N];
12 int visited[N];
13 int road[N][N];
14
15
16
17 int getLowest(int n)
18 {
19 int low = 0;
20 for (int i = 1,min = lowest[0]; i < n; i++)
21 {
22 if (!visited[i] && lowest[i] < min)
23 {
24 low = i;
25 min = lowest[i];
26 }
27 }
28 return low;
29 }
30
31 int
32 main(void)
33 {
34
35 //ifstream cin("hello.txt");
36 int n,m;
37 while (cin >> n && n != 0)
38 {
39 int a,b,v,i;
40
41 memset(lowest, INF, sizeof(lowest));
42 memset(road, INF, sizeof(road));
43 memset(visited, 0, sizeof(visited));
44
45 m = n * (n-1) / 2;
46 for (i = 0; i < m; i++)
47 {
48 cin >> a >> b >> v;
49 road[a-1][b-1] = road[b-1][a-1] = v;
50 }
51 for (i = 0; i < n; i++)
52 lowest[i] = road[0][i];
53
54 visited[0] = 1;
55 int distance = 0;
56
57 for (i = 1; i < n; i++)
58 {
59 a = getLowest(n);
60 distance += lowest[a];//road[a][father[a]];
61 visited[a] = 1;
62
63 for (int j = 0; j < n; j++)
64 {
65 if (!visited[j] && lowest[j] > road[a][j])
66 {
67 lowest[j] = road[a][j];
68 }
69 }
70 }
71 cout << distance << endl;
72 }
73 return 0;
74 }


浙公网安备 33010602011771号