NOIP2010 关押罪犯
2015-10-07 20:40
197 查看
3关押罪犯
题目描述
S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整 数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。
在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。
那么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?
输入输出格式
输入格式:输入文件的每行中两个数之间用一个空格隔开。第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证1<aj=<=bj<=N ,0 < cj≤ 1,000,000,000,且每对罪犯组合只出现一次。
输出格式:
共1
行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出0。
输入输出样例
输入样例#1:4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884
输出样例#1:
3512
说明
【输入输出样例说明】罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。【数据范围】对于30%的数据有N≤
15。对于70%的数据有N≤ 2000,M≤
50000。对于100%的数据有N≤ 20000,M≤
100000。
【思路】
贪心+并查集。
由大到小对边进行处理:将边的两个端点放到不同的集合。如此反复,当出现两个端点位于同一个集合的时候,两个集合已经划分完成,而这条边就是在集合内部的最大边,即ans。
并查集:设两端点为uv ,将u所属集合与v+n所属集合合并表示uv不存在于同一个集合,同样的将v与u+n合并。所谓u+n即u的补集其中是u的敌人。这样不与v同属一个集合的点自然会被划分到一个集合。
需要注意ans==0的情况,这时候以上算法找不到答案,因此需要特殊处理。
【代码】
#include<iostream> #include<algorithm> using namespace std; const int maxn = 40000+10; struct Edge{ int u,v,w; bool operator <(const Edge& rhs) const{ return w>rhs.w; } }edges[maxn*3]; int p[maxn]; int n,m; inline int find(int u) { return u==p[u]? u: p[u]=find(p[u]); } int main() { ios::sync_with_stdio(false); cin>>n>>m; for(int i=0;i<m;i++) cin>>edges[i].u>>edges[i].v>>edges[i].w; for(int i=1;i<=n+n;i++) p[i]=i; sort(edges,edges+m); for(int i=0;i<m;i++) { int u=edges[i].u,v=edges[i].v; if(find(u)==find(v)) { cout<<edges[i].w; //划分结束后处于同一个集合的最大的边 return 0; } else { p[find(v+n)]=find(u); p[find(u+n)]=find(v); } } cout<<0; return 0; }
相关文章推荐
- Linux下高并发socket最大连接数所受的限制问题
- CPU流水线的探秘之旅
- 弱校联萌十一大决战之背水一战C. Counting Pair
- IOS 传感器
- Code optimization and organization in Javascript / jQuery
- Cubietruck查看CPU及硬盘温度
- 【转】Ubuntu通过修改配置文件进行网络配置
- NOIP2010 乌龟棋
- DTLS分析
- php程序员进阶指南
- Unity5系列资源管理AssetBundle——更新实现
- HDU-4122
- 建立索引所需要关注的问题
- js的链式调用-如何实现类似jquery的链式调用
- UESTC OJ 88 Fold The Paper(状态压缩啊)
- MySQL索引 查看、创建、删除
- Java基础编程3:水仙花数
- IOS开发:CoreData的应用
- 动手动脑及课后实验
- 笔记11 export to excel