做题记录:P1525 关押罪犯(洛谷)

P1525 关押罪犯

/*在这一道题中并查集的作用是:将同一个监狱里的罪犯合并到一起。
思路:将每对罪犯之间的怨气值从大到小排序,再依次把他们分到不
同的两个监狱里,当发现这一对罪犯已经在同一个监狱里时,就说明
他们已经不能再分开了(分开了就不是最优了)。此时,这一对罪犯
之间的怨气值就是答案。值得注意的是,当没有冲突发生时,要记得
输出0。那么,我们应该如何用并查集实现以上的思路呢?首先说几个
关键词语的含义:
1、“敌人”:如果一对罪犯被分到两个不同的监狱里,那么他们就互为“敌人”。
2、“朋友”:如果一对罪犯被分到一个监狱里,那么他们就互为“朋友”。
需要明确的一点是“敌人”的“敌人”,就是“朋友”。
当分开一对罪犯时(假设他们的名字叫x和y),若x还没有“敌人”,那么y就
是他的“敌人”(因为他们被分开了嘛);否则就把y所在的集合与x的“敌人”
所在的集合合并,因为x是y的“敌人”,所以x的“敌人”就是y的“敌人”的
“敌人”(即朋友),将y所在的集合与x的“敌人”所在的集合合并是因为x的
“敌人”和x关在不同的监狱里,而y又和x关在不同的监狱里,并且只有两个监
狱,所以x的“敌人”所在的集合里面的人和y所在的集合里面的人一定关在一
个监狱里。对y的“敌人”也这样处理一遍就可以了。*/
#include<iostream>
#include<cstdio>
#include<algorithm>
    using namespace std;
struct edge//存罪犯之间的怨气关系
{
    int u;
    int v;
    int w;
}e[100005];
bool cmp(edge x,edge y)//将怨气值从大到小排序的排序函数
{
    return x.w>y.w;
}
    //f为用作实现并查集的数组,表示的是第i个罪犯的“祖先”是谁,enemy储存的是第i个罪犯的某个敌人
    int f[20005],enemy[20005];
int find_(int x)//并查集查找函数
{
    if(f[x]==x) return x;
    return f[x]=find_(f[x]);
}
void merge_(int x,int y)//并查集合并函数
{
    int t1=find_(x),t2=find_(y);
    if(t1!=t2) f[t2]=t1;
    return;
}
int main()
{
    int n=0,m=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) f[i]=i;//并查集初始化
    for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    sort(e+1,e+m+1,cmp);//将怨气值从大到小排序
    for(int i=1;i<=m;i++)
    {
        if(find_(e[i].u)==find_(e[i].v))//如果这一对罪犯已经在同一个监狱里
        {
            printf("%d",e[i].w);//直接输出他们之间的怨气值
            return 0;//结束程序
        }
        //如果这一对罪犯仍能分开
        if(!enemy[e[i].u]) enemy[e[i].u]=e[i].v;//如果u还没有敌人,那么v就是他的敌人
            else merge_(e[i].v,enemy[e[i].u]);//否则,就将v与u的敌人合并
        if(!enemy[e[i].v]) enemy[e[i].v]=e[i].u;//如果v还没有敌人,那么u就是他的敌人
            else merge_(e[i].u,enemy[e[i].v]);//否则,就将u与v的敌人合并
    }
    printf("%d",0);//记得输出0
    return 0;
}

原文地址:https://www.cnblogs.com/wozaixuexi/p/8453557.html

时间: 2024-11-08 11:17:27

做题记录:P1525 关押罪犯(洛谷)的相关文章

洛谷P1525 关押罪犯 并查集

无冲突 输出 0 洛谷P1525 关押罪犯 并查集 用拆点法 将一个点拆成两份 一个点和 x 的朋友相连 一个点和 x的敌人相连 若 x 与 y 是敌人 因为只有两个阵营 所以满足敌人的敌人就是朋友 然后 x 连向 y 的敌人 y 连向 x 的敌人 因为这是双向边 所以 y的朋友就是x的敌人就不用连了 如果某一时刻 getfather(e[ i ].from)==getfather(e[ i ].to) 这说明两个点已经是敌人关系的两个人 通过朋友关系连上了 那就结束了 1 #include <

洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]

P1525 关押罪犯 513通过 1.4K提交 题目提供者该用户不存在 标签图论并查集NOIp提高组2010 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 咳咳.竟MLE了. 囧.运行时错误,错误编号-… 点2是何方神圣? 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

project euler做题记录

ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{array}{c} S(n) & = & \sum_{i = 1} ^ n \sum_{p = 1} ^ i \sum_{q = p + 1} ^ i \frac {1}{pq}[p + q \geq i][gcd(p, q) = 1] \& = & \sum_{i = 1} ^

退役前的做题记录5.0

退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树,这样跨越\(mid\)的点对之间的最短路一定会经过\(mid\),因此两点之间的最短路径就可以描述成最短路树上的两段到根路径.对每棵最短路树处理\(dfs\)序,用树状数组维护权值修改即可. [Wannafly挑战赛4F]线路规划 类似SCOI2016萌萌哒一题,并查集\(f_{i,j}\)表示从

后缀自动机做题记录

目录 后缀自动机做题记录 sp1811 sp1812 sp10570 luogu 2463 CF873F TJOI2015 弦论 AHOI2013 差异 HEOI2016/TJOI2016 字符串 HAOI2016 找相同字符 SDOI2016 生成魔咒 ZJOI2015 诸神眷顾的幻想乡 留坑待填 广义SAM 其他 NOI原题练习 后缀自动机做题记录 来填之前的坑了...考后大概会做做有字符串的综合题吧 sp1811 lcs板子,对于第一个串建出SAM,第二个串在上面跑,即可求出对于每一个位置

清华集训2014 做题记录

清华集训2014做题记录 已完成 [清华集训2014]玛里苟斯 [清华集训2014]主旋律 [清华集训2014]奇数国 [清华集训2014]矩阵变换 [清华集训2014]sum [清华集训2014]虫逢 [清华集训2014]玄学 [清华集训2014]文学 未完成 [清华集训2014]卡常数 [清华集训2014]简单回路 [清华集训2014]Router [清华集训2014] Breaking Bomber 写一题要膜一题题解,膜完题解膜代码,膜完代码膜指导,膜了好几天了还有四个题没做. [清华集

2020年3月做题记录

[不定时更新,赶论文,赶项目,1月~2月做题记录还在整理,自我训练] 反转链表 链接:https://leetcode-cn.com/problems/reverse-linked-list/ 类名: 考察点:链表.迭代.递归 解题过程: 力扣3月每日1题,题解链接: https://leetcode-cn.com/problems/reverse-linked-list/solution/di-2ci-da-qia-lian-biao-fan-zhuan-di-gui-by-wu-xi-/ 就

NOIP2010 提高组 洛谷P1525 关押罪犯

刚才做并查集想到了这道以前做的题,干脆一并放上来 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件. 每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到