【并查集】【P1525】关押罪犯

news/2024/7/2 21:03:36

传送门

Description

Input

Output

Sample Input

4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884

Sample Output

3512

Hint

Solution

  非常显然的并查集题目,在本题中,对于每个罪犯i,维护两个信息:必须要和他关在一起的罪犯的集合,以及和他有仇的罪犯的集合,由于监狱只有两个,所以和他有仇的罪犯一定被关在同一个集合里面。sort一遍贪心从上到下扫描。对于不得不管起来的两个有仇的人即为答案。

Code

#include<cstdio>
#include<algorithm>
namespace read{
    void imop(int&x){
        char ch=getchar();
        while(ch<'0'||ch>'9') ch=getchar();
        while(ch>='0'&&ch<='9')   x=x*10+ch-'0',  ch=getchar();
        return;
    }
    void op(int&x){
        char ch=getchar();
        int f=1;
        while(ch<'0'||ch>'9'){
            if(ch=='-') f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')   x=x*10+ch-'0',  ch=getchar();
        x*=f;
        return;
    }
}
namespace fusu{
    const int maxn = 20010 , maxm = 100010;
    struct Crim{
        int a,b,value;
    };
    Crim criminal[maxm];
    int n,m;
    inline bool cmp(Crim a,Crim b){return a.value<b.value;}
    int frog[maxn],enemy[maxn];
    inline int find(int x){
        if(frog[x]^x)    frog[x]=find(frog[x]);
        return frog[x];
    }
    void gather(int a,int b){
        int fa=find(frog[a]),fb=find(frog[b]);
        frog[fa]=fb;
        return;
    }
    void beginning(){
        for(int i=1;i<=n;++i)
            frog[i]=i;
        return;
    }
    int doit(){
        read::imop(n);read::imop(m);
        for(int i=1;i<=m;++i){
            read::imop(criminal[i].a);
            read::imop(criminal[i].b);
            read::imop(criminal[i].value);
        }
        std::sort(criminal+1,criminal+1+m,cmp);
        beginning();
        do{
            int fa=find(frog[criminal[m].a]),fb=find(frog[criminal[m].b]);
            if(!(fa^fb)){
                printf("%d\n",criminal[m].value);
                return 0;
            }
            if(!enemy[criminal[m].a])    enemy[criminal[m].a]=criminal[m].b;
                else gather(enemy[criminal[m].a],criminal[m].b);
            if(!enemy[criminal[m].b])    enemy[criminal[m].b]=criminal[m].a;
                else gather(enemy[criminal[m].b],criminal[m].a);
            --m;
        }while(m);
        printf("0\n");
        return 0;
    }
}
int main(){
    return fusu::doit();
}

Summary

对于并查集中的补集法,对于每个个体记录多个信息,在合并时合并多个信息即可。

转载于:https://www.cnblogs.com/yifusuyi/p/9201021.html


http://www.niftyadmin.cn/n/2752952.html

相关文章

Python 十进制转换为二进制 高位补零

这里需要使用内置函数.format() 高位补零 >>> a 2 >>> b {:08b}.format(a)输出结果为八位二进制&#xff0c;且高位补零。 高位不补零 >>> b {:8b}.format(a)输出结果为八位二进制&#xff0c;但是高位不补零。 需要注意的是&#xff0c;输…

全局过滤器filter的用法

**1.**注册在全局的fliter (1)全局方法 Vue.filter() 注册一个自定义过滤器,必须放在Vue实例化前面 (2) 过滤器函数始终以表达式的值作为第一个参数。带引号的参数视为字符串&#xff0c;而不带引号的参数按表达式计算 (3)可以设置两个过滤器参数,前提是这两个过滤器处理的不冲…

在Maven上Web项目添加Spring框架

1. pom.xml添加Spring依赖包 <!-- spring 核心依赖--><!-- context依赖beans,aop,core,expression;core依赖logging;所以一次导入6个包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId&…

Ubuntu下 DevToolsActivePort file doesn't exist 错误

错误描述 Ubuntu下运行一个selenium调用无头chrome浏览器进行爬取的Python程序报出如下的错误&#xff1a; (unknown error: DevToolsActivePort file doesnt exist) (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDri…

LOW逼三人组(一)----冒泡算法

排序 1、冒泡排序 冒泡算法 import random # 随机模块 def bubble_sort(li): ###################################冒泡排序#####################################for i in range(len(li)-1): # 多少趟for j in range(len(li)-i-1): #一趟里多少次if li[j]>li…

浏览器输入URL回车会发生什么

这是一个非常经典的面试题,这道题没有具体的答案,它涉及很多的知识点&#xff0c;面试官会通过这道题了解你对哪一方面的知识比较擅长&#xff0c; 然后继续追问看看你的掌握程度。当然我写的这些也只是我的一些简单的理解&#xff0c;从前端的角度出发&#xff0c;我觉得首先回…

Redis:WRONGTYPE Operation against a key holding the wrong kind of value

错误信息 redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value分析 当前程序中key的操作类型&#xff0c;并不与redis库中存在的key的类型相匹配。 举例&#xff1a; 第一次保存key&#xff0c;将其设…

epoll_wait会被系统中断唤醒

今天&#xff0c;当一个程序在epoll_wait阻塞时&#xff0c;用strace跟踪了一下&#xff0c;结果epoll_wait就被EINTR唤醒了&#xff0c;并且返回-1&#xff1b; 所以&#xff0c;当epoll_wait返回-1时&#xff0c;需要判断errno是不是EINTR&#xff0c;如果是&#xff0c;继续…