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 }