更好的阅读体验

Portal

Portal1: Luogu

Portal2: LibreOJ

Description

\(S\)城现有两座监狱,一共关押着\(N\)名罪犯,编号分别为\(1 - N\)。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为\(c\) 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为\(c\)的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。

在详细考察了\(N\)名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。

那么,应如何分配罪犯,才能使\(\rm Z\)市长看到的那个冲突事件的影响力最小?这个最小值是多少?

Input

每行中两个数之间用一个空格隔开。第一行为两个正整数\(N, M\),分别表示罪犯的数目以及存在仇恨的罪犯对数。接下来的\(M\)行每行为三个正整数\(a_j, b_j, c_j\),表示\(a_j\)号和\(b_j\)号罪犯之间存在仇恨,其怨气值为\(c_j\)。数据保证\(1<aj \le b_j \le N ,0 < cj \le 1, 000, 000, 000\),且每对罪犯组合只出现一次。

Output

共\(1\) 行,为\(\rm Z\)市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出\(0\)。

Sample Input

  1. 4 6
  2. 1 4 2534
  3. 2 3 3512
  4. 1 2 28351
  5. 1 3 6618
  6. 2 4 1805
  7. 3 4 12884

Sample Output

  1. 3512

Hint

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

【数据范围】

对于\(30\%\)的数据有\(N \le 15\)。

对于\(70\%\)的数据有\(N \le 2000,M \le 50000\)。

对于\(100\%\)的数据有\(N \le 20000,M \le 100000\)。

Solution

题目要把罪犯们放到两个监狱,很容易想到是二分图。

我们可以先用二分答案,对于每一条大于二分出来的边(也就是不能放在一个监狱的两个罪犯,放入了答案就大于二分的值了)构成的图,判断是否能构成二分图,也就是是否可以将这些点分到两个区域。如果可以,那么说明了这个最大破坏度是可行的,所以就扩大二分值,最后求出最大值的最小值。

Code

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. using namespace std;
  8. const int MAXN = 100005, MAXM = 200005;
  9. struct EDGE {
  10. int nxt, to, val;
  11. } edge[MAXM];
  12. int n, m, u, v, val, cnt, U[MAXN], V[MAXN], VAL[MAXN], col[MAXM], head[MAXM];
  13. inline void addedge(int u, int v, int val) {//邻接表存图
  14. edge[++cnt].to = v; edge[cnt].val = val; edge[cnt].nxt = head[u]; head[u] = cnt;
  15. }
  16. inline bool check(int x) {//黑白染色,判断二分图
  17. queue<int> Q;
  18. memset(col, 0, sizeof(col));
  19. for (int i = 1; i <= n; i++)
  20. if (!col[i]) {
  21. Q.push(i);
  22. col[i] = 1;
  23. while (!Q.empty()) {
  24. int u = Q.front();
  25. Q.pop();
  26. for (int i = head[u]; ~i; i = edge[i].nxt) {
  27. int v = edge[i].to;
  28. if (edge[i].val >= x) {
  29. if (!col[v]) {
  30. col[v] = 3 - col[u];//标记状态(颜色)
  31. Q.push(v);
  32. } else
  33. if (col[u] == col[v]) return 0;//如果冲突,就返回不是
  34. }
  35. }
  36. }
  37. }
  38. return 1;
  39. }
  40. int main() {
  41. scanf("%d%d", &n, &m);
  42. int r = -1;
  43. memset(head, -1, sizeof(head));
  44. for (int i = 1; i <= m; i++) {
  45. scanf("%d%d%d", &u, &v, &val);
  46. r = max(r, val);
  47. addedge(u, v, val);
  48. addedge(v, u, val);//双向边
  49. }
  50. r++;
  51. int l = 0;
  52. while (l + 1 < r) {//二分答案
  53. int mid = l + r >> 1;
  54. if (check(mid)) r = mid; else l = mid;
  55. }
  56. printf("%d\n", l);
  57. return 0;
  58. }

Attachment

测试数据下载:https://www.lanzous.com/i7ayq3a

「Luogu 1525」关押罪犯的更多相关文章

  1. # 「NOIP2010」关押罪犯(二分图染色+二分答案)

    「NOIP2010」关押罪犯(二分图染色+二分答案) 洛谷 P1525 描述:n个罪犯(1-N),两个罪犯之间的仇恨值为c,m对仇恨值,求怎么分配使得两件监狱的最大仇恨值最小. 思路:使最大xxx最小 ...

  2. 「 Luogu P1231 」 教辅的组成

    题目大意 有 $\text{N1}$ 本书 $\text{N2}$本练习册 $\text{N3}$本答案,一本书只能和一本练习册和一本答案配对.给你一些书和练习册,书和答案的可能的配对关系.问你最多可 ...

  3. 「Luogu 2367」语文成绩

    更好的阅读体验 Portal Portal1: Luogu Description 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行.她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少 ...

  4. 「Luogu 1821」[USACO07FEB]银牛派对Silver Cow Party

    更好的阅读体验 Portal Portal1: Luogu Portal2: POJ Description One cow from each of N farms \((1 \le N \le 1 ...

  5. 「Luogu 1349」广义斐波那契数列

    更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今 ...

  6. 「Luogu 3792」由乃与大母神原型和偶像崇拜

    更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...

  7. 「Luogu P3866」[TJOI2009]战争游戏 解题报告

    题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...

  8. 「Luogu P2201」数列编辑器 解题报告

    数列编辑器,在线IDE 本期的主题是洛谷的在线IDE 小学生?!小学生虐我

  9. 「Luogu 1471」 方差

    题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 输入输出 ...

随机推荐

  1. 引入外部js

    引入外部js应该使用完整标签<script></script>,而使用单标签<script src=“”/>是错误的

  2. Spring Security 动态url权限控制(三)

    一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...

  3. DataStructure之线性表以及其实现

    线性表 应用:多项式的表示 什么是线性表 多项式表示问题给出的启示: 同一个问题可以有不同的表示(存储)方法 有一类共性问题 : 有序线性序列的租住和管理 “线性表(Linear List)” : 由 ...

  4. Windows系统调用中API的3环部分(依据分析重写ReadProcessMemory函数)

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API的3环部分 一.R3环API分析的重 ...

  5. Ubunut18 安装docker环境&&AWD攻防平台部署

    docker:有两个版本:docker-ce(社区版)和docker-ee(企业版). 参考官网地址:https://docs.docker.com/engine/installation/linux ...

  6. 机器学习实战3:逻辑logistic回归+在线学习+病马实例

    本文介绍logistic回归,和改进算法随机logistic回归,及一个病马是否可以治愈的案例.例子中涉及了数据清洗工作,缺失值的处理. 一 引言 1 sigmoid函数,这个非线性函数十分重要,f( ...

  7. JSON:JSON对象和JSON数组混排的复杂字符串

    在java中的一个好用的JSON工具包:net.sf.json.JSONObject 和 net.sf.json.JSONArray 一 解析JSON对象和JSON数组类型混排的复杂字符串 举个例子: ...

  8. Redis 3.0中文版学习(一)

    网址:http://wiki.jikexueyuan.com/project/redis-guide/entry-to-master-a.html http://www.yiibai.com/redi ...

  9. (20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)

    1.必需和可选属性 如果实体属性可以包含null,则将其视为可选.如果属性的有效值不可以包含null,则将其视为必需属性.映射到关系数据库架构时,必需的属性将创建为不可为null的列,而可选属性则创建 ...

  10. linux网络通讯相关命令

    ifconfig 1.查看当前使用的网卡 watch cat /proc/net/dev 看下哪张网卡的流量变化大一般就是哪张网卡是在线使用的 2.ifconfig查看所有网卡信息,ifconfig ...