题目链接


题解

算法

  • 一个经典的并查集
  • 但是需要用一点贪心的思想

做法

  • 先将给的冲突们按冲突值从大到小进行排序(这很显然)
  • 然后一个一个的遍历它们
  • 如果发现其中的一个冲突里的两个人在同一个集合里,直接输出当时的冲突值
  • 否则,第一个人不妨设其为\(x\),用一个\(op[x]\)来保存上一个与他冲突的人。如果\(op[x]\)为\(0\),也就是还没有上一个冲突,直接将\(op[x]\)赋值为当时的第二个人(不妨设其为\(y\));如果有冲突,则直接将\(op[x]\)与\(y\)合并。

代码

#include <cstdlib>
#include <cstdio>
#include <algorithm>
#define MAXN 20005
#define MAXM 100005
using namespace std; int n, m;
int p[MAXN];
int op[MAXN];//保存冲突
int ans;
struct fight
{
int x, y;
int s;
}l[MAXM]; bool cmp(fight t1, fight t2)
{
return t1.s > t2.s;
}//结构体排序 int find(int x)
{
if(p[x] < 0) return x;
return p[x] = find(p[x]);
}//路径压缩 void Union(int x, int y)
{
x = find(x);
y = find(y);
if(x == y) return ;
if(p[x] > p[y]) swap(x, y);
p[x] += p[y];
p[y] = x;
}//合并
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) p[i] = -1;
for(int i = 1; i <= m; i++) scanf("%d%d%d", &l[i].x, &l[i].y, &l[i].s);
sort(l + 1, l + m + 1, cmp);
for(int i = 1; i <= m; i++)
{
int a = l[i].x;
int b = l[i].y;
int fa = find(a);
int fb = find(b);
if(fa == fb)
{
ans = l[i].s;
break;
}
else
{
if(op[a] == 0) op[a] = b; //如果没有冲突,将冲突设置为b
else Union(find(b), find(op[a]));//有冲突,合并 if(op[b] == 0) op[b] = a;
else Union(find(a), find(op[b]));//同上 //主思路
}
}
printf("%d\n", ans);
return 0;
}

题解【luoguP1525 NOIp提高组2010 关押罪犯】的更多相关文章

  1. NOIP提高组2010 关押罪犯

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  2. noip提高组 2010 关押罪犯 (洛谷1525)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

  3. noip 提高组 2010

    T1:机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英 ...

  4. 题解 【luogu P1541 NOIp提高组2010 乌龟棋】

    题目链接 题解 题意: 有一些格子,每个格子有一定分数. 给你四种卡片,每次可以使用卡片来前进1或2或3或4个格子并拾取格子上的分数 每张卡片有数量限制.求最大分数. 分析 设\(dp[i]\)为第前 ...

  5. 2010提高组-C]关押罪犯(扩展域并查集

    题:https://www.cometoj.com/problem/0073 #include<bits/stdc++.h> using namespace std; ; struct n ...

  6. NOIP提高组2010 乌龟棋

    小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. 乌 ...

  7. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  8. [NOIP提高组2018]货币系统

    [TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...

  9. 津津的储蓄计划 NOIp提高组2004

    这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...

随机推荐

  1. Maven编译Java项目

    Spring在线参考文档: http://spring.io/guides/gs/maven/ 下载安装 Downloadand unzip the source repository for thi ...

  2. Python3 Tkinter-Grid

    1.创建 from tkinter import * root=Tk() lb1=Label(root,text='Hello') lb2=Label(root,text='Grid') lb1.gr ...

  3. window.open()与window.showModalDialog区别

    window.open()与window.showModalDialog区别 弹出窗口两种方式:    1.window.showModalDialog:      var feature = &qu ...

  4. 【转】Hbuilder MUI 页面刷新及页面传值问题

    文章来源:http://www.111cn.net/sys/CentOS/67213.htm 一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面 ...

  5. 常用算法Java实现之选择排序

    选择排序算法在每一步中选取最小值来重新排序,通过选择和交换来实现排序. 具体流程如下: 1.首先从原数组中选择最小的1个数据,将其置于第一个位置. 2.然后从剩下的数据中再选择其中最小的一个数据,并将 ...

  6. Java常用类之String

    String 类: 1. java.lang.String 类代表不可变的字符序列:  2. “XXX” 为该类的一个对象: 3. String 类的常用构造方法: ① String(String o ...

  7. 在用js拼接html时,给元素加不上事件的问题

    问题描述:有时,发起ajax请求成功后,需要用js去拼接一小段html字符串,然后给某些元素添加事件时,事件总是加不上. 解决办法:在success 回调函数内,给元素添加事件绑定. 代码如下: $. ...

  8. ACM 第十天

    动态规划2 1.树形DP 2.概率DP 3.区间DP 模板 ; len < n; len++) { //操作区间的长度 , j = len; j <= n; i++, j++) { //始 ...

  9. eclipse 创建并运行maven web项目

    这两天想在eclipse上运行maven web项目,折腾了许久,总算success啦. 1,利用eclipse创建dynamic web project(eclipse需要安装m2eclipse). ...

  10. exception = {"元数据集合中已存在具有标识“xxx”的项。\r\n参数名: item"}

    vs提示:exception = {"元数据集合中已存在具有标识"xxx"的项.\r\n参数名: item"} 出现这个错误说明有重复的字段,有可能是继承的类里 ...