/*
贪心 + 并查集 之 CODE[VS] 1069 关押罪犯 2010年NOIP全国联赛提高组
两座监狱,M组罪犯冲突,目标:第一个冲突事件的影响力最小。
依据冲突大小,将M组罪犯按从大到小排序,按照排序结果,依次把每组罪犯分开放入两个监狱,
直到当前这组罪犯已经在同一个监狱中了,此时即为答案。
实现: 1)通过不在同一个监狱的罪犯,推断出在同一个监狱的罪犯。(依据:一共就两个监狱)
ftr[b] = a+n // a和b是在不同监狱
ftr[c] = a+n // a和c是在不同监狱
=> b和c根节点相同,在同一个监狱的
据此可以判断当前这组罪犯是否已经在同一个监狱中了。
2)a,b不能在一个监狱,则a的根节点和b的根节点不能在同一个监狱
eg:假设a的根节点c,b的根节点d
a-c 不可
b-d 不可
a-b 不可
=> c-d不可,故ftr[c]=d,ftr[d]=c
ftr[x] = x //x尚未分配监狱
ftr[x] > n //x已分配监狱
*/
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstddef> 5 #include <iterator> 6 #include <algorithm> 7 #include <string> 8 #include <locale> 9 #include <cmath> 10 #include <vector> 11 #include <cstring> 12 #include <map> 13 #include <utility> 14 #include <queue> 15 #include <stack> 16 #include <set> 17 #include <functional> 18 using namespace std; 19 typedef pair<int, int> P; 20 const int INF = 0x3f3f3f3f; 21 const int modPrime = 3046721; 22 const double eps = 1e-9; 23 const int MaxN = 20010; 24 const int MaxM = 100010; 25 26 int N, M; 27 struct Node 28 { 29 int a, b, c; 30 }; 31 32 Node nodeVec[MaxM]; 33 34 bool Cmp(const Node n1, const Node n2) 35 { 36 return n1.c > n2.c; 37 } 38 39 /**************************************/ 40 //Union-Find Sets 41 42 int ftr[MaxN << 1]; 43 44 void ufsIni(int n) 45 { 46 for (int i = 0; i <= n; ++i) 47 { 48 ftr[i] = i; 49 } 50 } 51 52 int ufsFind(int x) 53 { 54 if (x == ftr[x]) 55 { 56 return x; 57 } 58 return ftr[x] = ufsFind(ftr[x]); 59 } 60 /**************************************/ 61 62 63 void Solve() 64 { 65 int ans = 0; 66 ufsIni((N << 1)); 67 int x, y; 68 for (int i = 0; i < M; ++i) 69 { 70 x = ufsFind(nodeVec[i].a); 71 y = ufsFind(nodeVec[i].b); 72 if (x == y) 73 { 74 ans = nodeVec[i].c; 75 break; 76 } 77 ftr[x] = ufsFind(nodeVec[i].b + N); 78 ftr[y] = ufsFind(nodeVec[i].a + N); 79 } 80 printf("%d\n", ans); 81 } 82 83 int main() 84 { 85 #ifdef HOME 86 freopen("in", "r", stdin); 87 //freopen("out", "w", stdout); 88 #endif 89 90 scanf("%d %d", &N, &M); 91 for (int i = 0; i < M; ++i) 92 { 93 scanf("%d %d %d", &nodeVec[i].a, &nodeVec[i].b, &nodeVec[i].c); 94 } 95 sort(nodeVec, nodeVec + M, Cmp); 96 Solve(); 97 98 #ifdef HOME 99 cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; 100 _CrtDumpMemoryLeaks(); 101 #endif 102 return 0; 103 }
贪心 + 并查集 之 CODE[VS] 1069 关押罪犯 2010年NOIP全国联赛提高组
原文:http://www.cnblogs.com/shijianming/p/5042063.html