NOIP 2010 - 提高组 关押罪犯 二分答案+二分图的判定
来源:互联网 发布:国际网络电话软件排名 编辑:程序博客网 时间:2024/05/23 16:48
描述
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<=1000000000,且每对罪犯组合只出现一次。
输出格式
输出文件共1行,为Z市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出0。
样例
样例输入
4 61 4 25342 3 35121 2 283511 3 66182 4 18053 4 12884
样例输出
3512
限制
每个测试点1s
提示
分配方法:市长看到的冲突事件影响力是3512(由2号和3号罪犯引发)。其他任何分法都不会比这个分法更优。
对于30%的数据有N≤15。
对于70%的数据有N≤2000,M≤50000。
对于100%的数据有N≤20000,M≤100000。
思路:最大值最小首先想到二分答案法。验证方法如下:猜一个mid后,将小于等于mid的边都假删除掉,然后验证大于mid的边连成的图是否为二分图。(因为mid为发生冲突的最大权值,大于mid的边都不应该发生冲突,即应为二分图。)
代码:
/* Name: prison.cpp Copyright: Twitter & Instagram @stevebieberjr Author: @stevebieberjr Date: 06-10-16 09:22*/#include<cstdio>#include<algorithm>#include<vector>#include<cstring>#define maxn 20005using namespace std;struct data{int a,b,c;};int n,m;vector<int>g[maxn],w[maxn];int vis[maxn]={0};int q[maxn];int front,rear;bool BFS(int s,int m){ front=rear=1; q[rear++]=s; vis[s]=1; while(front!=rear) { int i=q[front]; front++; for(int k=0;k<g[i].size();k++) { if(w[i][k]>m) { int j=g[i][k]; if(vis[i]==vis[j]) return 0; if(vis[j]==0) { q[rear++]=j; vis[j]=3-vis[i]; } } } } return 1;}bool check(int t){ memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { if(vis[i]==0) { bool ok=BFS(i,t); if(!ok) return false; } } return true;}int main(){ //freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); int x,y,z; for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); g[x].push_back(y); g[y].push_back(x); w[x].push_back(z); w[y].push_back(z); } int A=0,B=1000000000,ans; while(A<=B) { int C=(A+B)/2; int ok=check(C); if(ok) B=C-1,ans=C; else A=C+1; } printf("%d\n",ans); return 0;}
- NOIP 2010 - 提高组 关押罪犯 二分答案+二分图的判定
- NOIP 2010 关押罪犯 二分答案+二分图染色判定 COGS 520
- noip 2010 关押罪犯 二分图
- 【图-二分图染色】NOIP2010提高组关押罪犯
- NOIP提高组2010 关押罪犯
- NOIP 提高组 2010 关押罪犯
- NOIP2010 关押罪犯 (二分答案+二分图染色)
- noip2010 关押罪犯 二分答案+二分图判断
- NOIP 2010 关押罪犯 并查集 二分+二分图染色
- [NOIP2010]关押罪犯(二分+二分图染色)
- 【二分】关押罪犯
- [codevs1069]关押罪犯 二分图染色
- noip 2010 关押罪犯
- noip 2010 关押罪犯
- NOIP 2010 关押罪犯
- 【noip 2010】关押罪犯
- NOIP2010 Codevs 1069 关押罪犯 [并查集] [二分图判定]
- [NOIP2010][并查集][二分答案]关押罪犯
- Msql 中的 时间段查询(一天,一周,一个月)
- Linux下spi驱动开发(2)
- 出现Unknown class BMKMapView in Interface Builder file异常
- 豆瓣电影分析报告:大陆和港台到底差(cha)在哪里?
- Easy 67题 Add Binary
- NOIP 2010 - 提高组 关押罪犯 二分答案+二分图的判定
- 1622-5 孔富晨 总结《2016年10月5日》【连续第5天总结】
- 迭代带来数据疯狂(数据字典查询)
- Android Studio百度地图(BaiduMap)开发教程,
- 将二维数组作为参数的函数原型
- springmvc中的对象、数组、集合类型的参数绑定
- struts2+hibernate改造考勤系统备忘录(一)
- JAVA--File类
- 笔记7:java_封装性