洛谷 P1525 关押罪犯 NOIp2010提高组 (贪心+并查集)
题目链接:https://www.luogu.org/problemnew/show/P1525
题目分析
通过分析,我们可以知道,这道题的抽象意义就是把一个带边权的无向图,分成两个点集,使得两个集合中的每两个点之间的边权最大的最小。问这个边权是多少。
我们不妨可以想一下,如果$a$和$b$是敌人,但$a$和$b$的有些敌人不是敌人,对于处理$a$来说,肯定是把他和那些$b$的敌人放在一起比较好。 再来看下题目,尽可能地让最大的最小,所以我们可以贪心一下下~~~ 把所有的“敌人对”按照边权从大到小排个序。 然后按顺序判$a$ ,$b$在不在一个点集里头(这里便用到了并查集,直接查父亲是不是一个就好),如果在,就可以输出边权了。如果不在,把$a$和$b$的敌人放在一起,$b$和$a$的敌人放在一起(参见上上行)。
肯定有人要问为什么。呃。。 因为边权是排过序的,第一个匹配不上的肯定是最优解。(此处需脑补一下。。)
呃。。然后就可以开始码代码了。
#include <stdio.h>
#include <algorithm>
using namespace std;
const int M=100003;
const int N=20003;
struct node
{
int x, y, z;
}f[M];
int a[N];
int b[N];
bool cmp(node x,node y)
{
return x.z > y.z;
}
int find(int x)
{
if(a[x] == x)
return x;
a[x] = find(a[x]);
return a[x];
}
void update(int x,int y)
{
int fx = find(x);
int fy = find(y);
a[fx] = fy;
}
bool check(int x,int y)
{
int fx = find(x);
int fy = find(y);
if(fx == fy)
return true;
return false;
}
int main()
{
int n, m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n; i ++)
a[i]=i;
for(int i = 1;i <= m; i ++)
scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].z);
sort(f+1,f+1+m,cmp);
for(int i = 1;i <= m+1; i ++)
{
if(check(f[i].x,f[i].y))
{
printf("%d",f[i].z);
break;
}
else
{
if(!b[f[i].x])
b[f[i].x]=f[i].y;
else
update(b[f[i].x],f[i].y);
if(!b[f[i].y])
b[f[i].y]=f[i].x;
else
update(b[f[i].y],f[i].x);
}
}
return 0;
}
洛谷 P1525 关押罪犯 NOIp2010提高组 (贪心+并查集)的更多相关文章
- 洛谷 P1525 关押罪犯 & [NOIP2010提高组](贪心,种类并查集)
传送门 解题思路 很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个监狱中,第一个不符合的就是答案. 怎样判断是否在一个监狱中呢? 很显然,就是用种类并查集. 种类并查集的讲解——团伙(很 ...
- 洛谷 P1525 关押罪犯
题目链接 https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1−N.他们之间的关系自然也极不和谐.很多罪 ...
- 洛谷P1525 关押罪犯
To 洛谷.1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用 ...
- 洛谷1525 关押罪犯NOIP2010 并查集
问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...
- 洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]
P1525 关押罪犯 513通过 1.4K提交 题目提供者该用户不存在 标签图论并查集NOIp提高组2010 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 咳咳.竟MLE了. 囧.运行时错误 ...
- 洛谷 P1541 乌龟棋 & [NOIP2010提高组](dp)
传送门 解题思路 一道裸的dp. 用dp[i][j][k][kk]表示用i个1步,j个2步,k个3步,kk个4步所获得的最大价值,然后状态转移方程就要分情况讨论了(详见代码) 然后就是一开始统计一下几 ...
- [NOIP2010] 提高组 洛谷P1525 关押罪犯
刚才做并查集想到了这道以前做的题,干脆一并放上来 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可 ...
- 洛谷-关押罪犯-NOIP2010提高组复赛
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- 洛谷P1525 关押罪犯(并查集、二分图判定)
本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...
随机推荐
- 算法与数据结构基础 - 合并查找(Union Find)
Union Find算法基础 Union Find算法用于处理集合的合并和查询问题,其定义了两个用于并查集的操作: Find: 确定元素属于哪一个子集,或判断两个元素是否属于同一子集 Union: 将 ...
- WebService1
一.什么是WebService(来源百度百科) Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述. ...
- 二.Google黑客语法
搜索也是一门艺术! 说起Google,可谓是无人不知无人不晓,其强大的搜索功能,可以让你在瞬间找到你想要的一切.对于黑客而言,Google可是 一款绝佳的黑客工具.正因Google强大的检索能力,黑客 ...
- 整合-flowable-modeler,第一篇
BPMN流程想必大家都不陌生,经过这十几年的不断发展完善,在处理业务流程操作已经相当完善,我这里先不进行流程引擎的具体描述,单对集成流程设计器这块进行笔记,如有不对,跪求指出.
- SpringBoot:实现定时任务
一.定时任务实现的几种方式: Timer 这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执 ...
- 随笔编号-15 重构--改善既有代码的设计--Day01--学习笔记
最近公司开发的系统在进行大批量数据查询的时候发现响应速度变得让人无法忍受,so 老大安排我进行代码重构的工作,主要目的就是为提高代码的执行效率.减小方法之间的响应时间.降低方法之间的耦合度.= =! ...
- 解决ionic 启动页面图片没有显示及启动页出现黑白屏
1.ionic 正确打包完app, 并且按照正常的步骤配置config.xml文件之后 ,启动页面还是不能正常的显示出来,而是黑了一下之后,就进入首页了 原因很有可能就是你没有装cordova-plu ...
- 如何使用 Skywalking Agent ?
如何使用 Skywalking Agent ? 如果你还不知道 Skywalking agent 是什么,请点击这里查看 Probe 或者这里查看快速了解agent,由于我这边大部分都是 JAVA 服 ...
- xgboost保险赔偿预测
XGBoost解决xgboost保险赔偿预测 import xgboost as xgb import pandas as pd import numpy as np import pickle im ...
- 《GO Home Trash!》UML类图,ER图以及数据库设计
<Go Home Trash!>UML类图 ER图以及数据库中数据表 分析: 这款软件经过我们前期的讨论以及需求分析,确定了用户,客服以及管理员三个实体.在设计UML类图时,对各个实体之间 ...