SOJ2198 Highways 最小生成树 kruskal算法

第一次写博客 

最小生成树入门题 附上链接 

http://cstest.scu.edu.cn/soj/problem.action?id=2198

这是一道kruskal的模板题(刘汝佳的小白书——《算法竞赛与入门经典》上有基本一模一样的代码)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <string>
 6 #include <iterator>
 7 #include <algorithm>
 8 #include <cstdlib>
 9 #include <deque>
10 #include <queue>
11 #include <stack>
12 #include <map>
13 #include <vector>
14 #include <set>
15 #include <list>
16 using namespace std;
17 #define PI acos(-1.0)
18 #define INF 0x3f3f3f3f
19 #define MAX 1000005
20 #define MST(a,b) memset(a,b,sizeof(a))
21 #define MOD 1000000007
22 #define EPS 1e-6
23 typedef long long LL;
24 typedef unsigned long long LLU;
25 int n,t;
26 int p[MAX],r[MAX],u[MAX],v[MAX],w[MAX];;
27 int cmp(const int i,const int j) {
28     return w[i] < w[j];
29 }
30 int find(int x) {
31     return p[x] == x ? x : p[x] = find(p[x]);
32 }
33 int kruskal() {
34     int ans = 0;
35     for(int i = 0;i < n;i ++)
36         p[i] = i;
37     for(int i = 0;i < t;i ++)
38         r[i] = i;
39     sort(r,r + t,cmp);
40     for(int i = 0;i < t;i ++) {
41         int e = r[i];
42         int x = find(u[e]);
43         int y = find(v[e]);
44         if(x != y) {
45             ans = max(ans,w[e]);
46             p[x] = y;
47         }
48     }
49     return ans;
50 }
51 int main() {
52     int cases;
53     scanf("%d",&cases);
54     while(cases --) {
55         t = 0;
56         scanf("%d",&n);
57         for(int i = 0;i < n;i ++) {
58             for(int j = 0;j < n;j ++) {
59                 int tmp;
60                 scanf("%d",&tmp);
61                 if(j > i) {
62                     u[t] = i;
63                     v[t] = j;
64                     w[t ++] = tmp;
65                 }
66             }
67         }
68         printf("%d\n",kruskal());
69     }
70     return 0;
71 }

 

 

posted @ 2014-05-04 17:02  Mite  阅读(228)  评论(1)    收藏  举报