洛谷P1525关押罪犯

关押罪犯

题目描述

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

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

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

那么,应如何分配罪犯,才能使 Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?
输入描述
每行中两个数之间用一个空格隔开。第一行为两个正整数 N,M,分别表示罪犯的数目以及存在仇恨的罪犯对数。接下来的 M 行每行为三个正整数 a ,b ,c 表示编号为 a 的罪犯与编号为 b 的罪犯之间的怨气值为 c,且每对罪犯组合只出现一次。(1 <= a <= b <= N,0 <= c <=1e9)
输出描述
共 1 行,为 Z 市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出 0
原题链接


Input

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

Output

3512

AC代码

#include <iostream>
#include <algorithm>
using namespace std;
struct node {
    int x,y,w;
};
const int N = 2e4 + 10,M = 1e5+10;
node arr[M]; //存关系
int h[N],e[N],n,m; // h存的是谁跟谁已经在一个监狱里面了(并查集思想),e存的是谁的敌人是谁
bool cmp (node a,node b){
    return a.w > b.w;
}
int find (int x){ //查找 x 所在的监狱
    if(h[x] != x) x = find(h[x]);
    return x;
}
void add (int x,int y){ //合并x,y所在的犯人堆
    h[find(x)] = find(y);
}
bool check (int x,int y){ //判断x,y是否在同一个监狱
    if(find(x) == find(y)) return true;
    return false;
}
void init (){ // 初始化
    for(int i = 1; i <= n; i++)
        h[i] = i;
}
int main(){
    scanf("%d%d",&n,&m);
    init();
    for(int i = 0; i < m; i++)
        scanf("%d%d%d",&arr[i].x,&arr[i].y,&arr[i].w);
    sort(arr,arr + m,cmp);
    for(int i = 0; i < m + 1; i++){
        if(check(arr[i].x,arr[i].y)) { //如果 x 和 y 已经在一个监狱里面了就输出,不懂的话可以自已用这个代码走一下样例
            printf("%d",arr[i].w);
            break;
        }
        else{
            if(!e[arr[i].x]) e[arr[i].x] = arr[i].y; // 如果 x 还没有敌人,就让 x 的敌人为 y
            else add(e[arr[i].x],arr[i].y); // 如果 x 已经有敌人,就让 x 的敌人与 y 合并
            if(!e[arr[i].y]) e[arr[i].y] = arr[i].x; // 同理
            else add(e[arr[i].y],arr[i].x);
        }
    }
    return 0;
}
posted @ 2021-08-28 13:06  伍六柒-  阅读(69)  评论(4)    收藏  举报