最小生成树

Prim算法:

 1 #include <iostream>
 2 #include <vector>
 3 #include <climits>
 4 using namespace std;
 5 
 6 int N;
 7 vector<vector<int>> graph;
 8 vector<int> lowcost;
 9 vector<int> closest;
10 
11 void solve() {
12     int u = 0;
13     int cost = 0;
14     for (int i = 0; i < N; ++i) {
15         lowcost[i] = graph[0][i];
16         closest[i] = 0;
17     }
18     closest[0] = -1;
19     for (int i = 0; i < N; ++i) {
20         int tmp_min = INT_MAX;
21         for (int j = 0; j < N; ++j) {
22             if (lowcost[j] != 0 && tmp_min > lowcost[j]) {
23                 tmp_min = lowcost[j];
24                 u = j;
25             }
26         }
27         cost += lowcost[u];
28         lowcost[u] = 0;
29         for (int j = 0; j < N; ++j) {
30             if (lowcost[j] > graph[u][j]) {
31                 lowcost[j] = graph[u][j];
32                 closest[j] = u;
33             }
34         }
35     }
36     cout << cost << endl;
37 }
38 
39 int main() {
40     while (cin >> N) {
41         graph.assign(N, vector<int>(N));
42         lowcost.resize(N);
43         closest.resize(N);
44         for (int i = 0; i < N; ++i) {
45             for (int j = 0; j < N; ++j) {
46                 cin >> graph[i][j];
47             }
48         }
49         solve();
50     }
51     return 0;
52 }

Prim算法堆优化:

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int INF = 1e9;
 8 
 9 struct edge {
10     int idx;
11     int dist;
12     edge(int _idx, int _dist) : idx(_idx), dist(_dist) {}
13 };
14 
15 struct cmp {
16     bool operator () (const edge &a, const edge &b) { return a.dist > b.dist; }
17 };
18 
19 int N, M;
20 vector<vector<edge>> graph;
21 
22 void solve() {
23     int S = 1;
24     priority_queue<edge, vector<edge>, cmp> heap;
25     vector<int> lowcost(N + 1, INF);
26     vector<bool> visit(N + 1, false);
27     lowcost[S] = 0;
28     visit[S] = true;
29     int res = 0;
30     for (int i = 0; i < graph[S].size(); ++i) {
31         auto v = graph[S][i];
32         lowcost[v.idx] = min(lowcost[v.idx], v.dist);
33         heap.push(edge(v.idx, lowcost[v.idx]));
34     }
35     while (!heap.empty()) {
36         auto u = heap.top();
37         heap.pop();
38         if (visit[u.idx]) continue;
39         visit[u.idx] = true;
40         res += lowcost[u.idx];
41         lowcost[u.idx] = 0;
42         for (int i = 0; i < graph[u.idx].size(); ++i) {
43             auto v = graph[u.idx][i];
44             if (!visit[v.idx] && lowcost[v.idx] > lowcost[u.idx] + v.dist) {
45                 lowcost[v.idx] = lowcost[u.idx] + v.dist;
46                 heap.push(edge(v.idx, lowcost[v.idx]));
47             }
48         }
49     }
50     cout << res << endl;
51 }
52 
53 int main() {
54     while (cin >> N >> M) {
55         int u, v, len;
56         graph.resize(N + 1);
57         for (int i = 0; i < M; ++i) {
58             cin >> u >> v >> len;
59             graph[u].push_back(edge(v, len));
60             graph[v].push_back(edge(u, len));
61         }
62         solve();
63     }
64     return 0;
65 }

Kruscal算法:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 struct edge {
 7     int a;
 8     int b;
 9     int cost;
10 };
11 
12 vector<edge> graph;
13 vector<int> father;
14 int N, M;
15 
16 int findFather(int i) {
17     while (i != father[i]) i = father[i];
18     return i;
19 }
20 
21 void solve() {
22     sort(graph.begin(), graph.end(),
23             [](const edge &a, const edge &b) { return a.cost < b.cost; });
24     for (int i = 1; i <= N; ++i) father[i] = i;
25     int cost = 0;
26     for (int i = 0; i < M; ++i) {
27         int fa = findFather(graph[i].a);
28         int fb = findFather(graph[i].b);
29         if (findFather(fa) != findFather(fb)) {
30             cost += graph[i].cost;
31             if (fa < fb) 
32                 father[fb] = fa;
33             else 
34                 father[fa] = fb;
35         }
36     }
37     cout << cost << endl;
38 }
39 
40 int main() {
41     while (cin >> N >> M) {
42         father.resize(N + 1);
43         graph.resize(M);
44         for (int i = 0; i < M; ++i) {
45             cin >> graph[i].a >> graph[i].b >> graph[i].cost;
46         }
47         solve();
48     }
49     return 0;
50 }

 

posted @ 2015-06-14 18:23  Eason Liu  阅读(118)  评论(0编辑  收藏  举报