最大权森林

 http://poj.org/problem?id=3723

分析:因为,图可能不连通,求所有最大生成树的总和最大,即最大权森林。

prime算法会超内存。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define _Clr(x, y) memset(x, y, sizeof(x))
 5 #define INF 0x3f3f3f3f
 6 #define N 20010
 7 using namespace std;
 8 
 9 struct Edge
10 {
11     int u, v, ca;
12     bool operator < (const Edge &a) const
13     {
14         return ca > a.ca;
15     }
16 }edge[N*3];
17 int n, m;
18 int bleg[N];
19 
20 int find(int x)
21 {
22     int y = x;
23     while(y != bleg[y])
24         y = bleg[y];
25     while(x != bleg[x])
26     {
27         int px = bleg[x];
28         bleg[x] = y;
29         x = px;
30     }
31     return y;
32 }
33 
34 int Kruskal(int r)
35 {
36     int ans=0;
37     for(int i=0; i<N; i++)
38         bleg[i] = i;
39     for(int i=0; i<r; i++)
40     {
41         int a = find(edge[i].u), b = find(edge[i].v);
42         if(a != b)
43         {
44             ans += edge[i].ca;
45             bleg[a] = b;
46         }
47     }
48     return ans;
49 }
50 int main()
51 {
52     int T, m, r;
53     int a, b, c;
54     //freopen("date.in","r", stdin);
55     scanf("%d", &T);
56     while(T--)
57     {
58         scanf("%d%d%d", &n, &m, &r);
59         for(int i=0; i<r; i++)
60         {
61             scanf("%d%d%d", &a, &b, &c);
62             a++, b++;
63             b += n;
64             edge[i].u=a, edge[i].v=b, edge[i].ca=c;
65         }
66         n += m;
67         sort(edge, edge+r);
68         int ans = Kruskal(r);
69         ans = 10000 * n - ans;
70         printf("%d
", ans);
71     }
72     return 0;
73 }
View Code
原文地址:https://www.cnblogs.com/khan724/p/4443089.html