最大权森林

 

 

 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\n", ans);

71     }

72     return 0;

73 }
View Code

 

你可能感兴趣的:(最大权森林)