博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P1525 关押罪犯
阅读量:4953 次
发布时间:2019-06-12

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

题目描述

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 61 4 25342 3 35121 2 283511 3 66182 4 18053 4 12884
输出样例#1: 
3512

说明

【输入输出样例说明】罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。

【数据范围】对于30%的数据有N≤ 15。对于70%的数据有N≤ 2000,M≤ 50000。对于100%的数据有N≤ 20000,M≤ 100000。

/*    二分answer + 染色判断    二分最大值,每次将不满足限制的边构建成图    进行染色,相邻的点染成不同颜色,若有冲突    说明染色失败,则当前二分的值过小 */#include 
#include
#include
#include
#include
#include
using namespace std;const int N = 2e4 + 10;int now = 1, n, m, maxn;struct Node{ int x, y, w;}S[N * 5];struct Edge{ int u, v, nxt;}E[N * 5];int col[N], head[N];bool flag;inline int read(){ int x = 0; char c = getchar(); while(c < '0' || c > '9') c = getchar(); while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x;}void add(int u, int v){ E[now].v = v; E[now].nxt = head[u]; head[u] = now ++;}void build_G(int x){ for(int i = 1; i <= m; i ++) { if(S[i].w > x) { int u = S[i].x; int v = S[i].y; add(u, v); add(v, u); } }}bool color(int x, int what){ if(!flag) return 0; col[x] = what; int nxt_what = what == 1 ? 2 : 1; for(int i = head[x]; ~ i; i = E[i].nxt) { int v = E[i].v; if(!col[v]) color(v, nxt_what); else if(col[v] == col [x]){ flag = 0; return 0; } }}inline bool check(int x){ now = 1; for(int i = 1; i <= n; i ++) head[i] = -1, col[i] = 0; build_G(x); flag = 1; for(int i = 1; i <= n; i ++) if(!col[i]) color(i, 1); return flag;}int main(){ n = read(); m = read(); for(int i = 1; i <= m; i ++) S[i].x = read(), S[i].y = read(), S[i].w = read(), maxn = max(maxn, S[i].w); int L = 0, R = maxn; int answer; while(L <= R) { int mid = (L + R) >> 1; if(check(mid)) answer = mid, R = mid - 1; else L = mid + 1; } printf("%d", answer); return 0;}

 

转载于:https://www.cnblogs.com/lyqlyq/p/7788563.html

你可能感兴趣的文章
详解软件工程之软件测试
查看>>
WCF(二) 使用配置文件实现WCF应用程序
查看>>
【CodeForces 803 C】Maximal GCD(GCD+思维)
查看>>
python 去掉换行符或者改为其他方式结尾的方法(end='')
查看>>
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
REST构架风格介绍:状态表述转移
查看>>
c++ operator
查看>>
java小技巧
查看>>
POJ 3204 Ikki's Story I - Road Reconstruction
查看>>
网页消息类
查看>>
【BZOJ】2959: 长跑(lct+缩点)(暂时弃坑)
查看>>
日常一些出现bug的问题
查看>>
同时启动多个tomcat服务器
查看>>
怎么将iphone上的照片导出到本地文件
查看>>
Repeater+DataPagerSource分页
查看>>
模块化导出
查看>>
pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页
查看>>
Sphinx 2.0.8 发布,全文搜索引擎 Installing Sphinx on Windows
查看>>
pod
查看>>
iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?
查看>>