博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOIP2010提高组]关押罪犯
阅读量:5124 次
发布时间:2019-06-13

本文共 977 字,大约阅读时间需要 3 分钟。

题目:洛谷P1525、Vijos P1776、codevs1069。

题目大意:有一些罪犯,两个罪犯之间可能会发生冲突,冲突有个影响力,而如果两个罪犯在不同监狱里,就可以避免冲突。现在有两个监狱,要你安排一种关押罪犯的方式,使得影响力最大的一次冲突影响力最小。

解题思路:贪心+并查集。先将所有冲突按影响力从大到小排序,然后一件一件处理,用并查集储存哪些罪犯处于同一个监狱中。我们把每个罪犯变成两个,如果该罪犯原来编号为$i$,那么现在编号为$2i$和$2i-1$,如果$2i$和$2j-1$处于同一个并查集内,则说明$i$和$j$关在不同的监狱里。如果两个罪犯已经在同一监狱里,则根据贪心的原则,该影响力就是答案。

注意题目说的如果没有冲突,输出0。

注意代码第24行和25行的合并操作。

C++ Code:

 

#include
#include
using namespace std;int n,m;struct edge{ int u,v,dis; bool operator <(const edge&rhs)const{return dis>rhs.dis;}}e[100005];int fa[40004];int dad(int x){ return x==fa[x]?x:fa[x]=dad(fa[x]);}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;++i)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].dis); sort(e+1,e+m+1); for(int i=1;i<=2*n;++i)fa[i]=i; for(int i=1;i<=m;++i){ int x=dad(2*e[i].u),y=dad(2*e[i].v); if(x==y){ printf("%d\n",e[i].dis); return 0; } fa[dad(2*e[i].u-1)]=y; fa[x]=dad(e[i].v*2-1); } puts("0"); return 0;}

 

转载于:https://www.cnblogs.com/Mrsrz/p/7249653.html

你可能感兴趣的文章
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
UseIIS
查看>>
集合体系
查看>>
vi命令提示:Terminal too wide
查看>>
引用 移植Linux到s3c2410上
查看>>
MySQL5.7开多实例指导
查看>>