首页 > 其他 > 详细

贪心 + 并查集 之 CODE[VS] 1069 关押罪犯 2010年NOIP全国联赛提高组

时间:2015-12-13 00:39:07      阅读:569      评论:0      收藏:0      [点我收藏+]

/*
贪心 + 并查集 之 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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!