ACM PKU 3723 Conscription http://poj.org/problem?id=3723

一道最大生成树的题,重载一下"<"号就行,因为会存在森林的情况,所以prim算法不好做,kruskal是是解决这道题的神器;

 1 #include <stdio.h>
2 #include <iostream>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6
7 const int maxp = 10005;
8
9 const int maxe = 50005;
10
11 int N,M,R;
12
13 int pre[maxp*2];
14
15 struct node
16 {
17 int start,end,weight;
18 } edge[maxe];
19
20 bool operator < (const node & a,const node & b)
21 {
22 return a.weight>b.weight;
23 }
24
25 int find (int x)
26 {
27 if(x!=pre[x]) pre[x]=find(pre[x]);
28 return pre[x];
29 }
30
31
32 int kruskal()
33 {
34 int root1,root2,total(0);
35 for(int i=0; i<R; i++)
36 {
37 root1=find(edge[i].start);
38 root2=find(edge[i].end);
39 if(root1==root2)continue;
40 total+=edge[i].weight;
41 pre[root1] = root2;
42 }
43 return total;
44 }
45
46 int main()
47 {
48 //freopen("in.txt","r",stdin);
49 int n_case;
50 scanf("%d",&n_case);
51 for(int i=0; i<n_case; i++)
52 {
53 scanf("%d%d%d",&N,&M,&R);
54 for(int i=0; i<R; i++)
55 {
56 int x,y,d;
57 scanf("%d%d%d",&x,&y,&d);
58 edge[i].start=x;
59 edge[i].end=N+y;
60 edge[i].weight=d;
61 }
62 for(int j=0; j<=M+N; j++)
63 {
64 pre[j]=j;
65 }
66 sort(edge,edge+R);
67 int sum = 10000*(M+N)-kruskal();
68 printf("%d\n",sum);
69 }
70 return 0;
71 }

  

posted on 2011-08-12 10:45  _Clarence  阅读(203)  评论(0编辑  收藏  举报

导航