P1525 关押罪犯

题面:https://www.luogu.org/problem/P1525

本题是一个很明显的种类并查集(带权并查集),只要尽可能让危害大的罪犯在两个监狱里即可,遇到不满足条件的就输出答案.
Code:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
using namespace std;
const int N=100005;
int n,m,fa[N];
struct Node{
    int a,b,c;
}cri[N];
bool cmp(Node x,Node y){
    return x.c>y.c;
}
int find(int x){
    if(fa[x]==x){
		return x;
	}
    return fa[x]=find(fa[x]);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&cri[i].a,&cri[i].b,&cri[i].c);
	}
    sort(cri+1,cri+1+m,cmp);
    for(int i=1;i<=n;i++){
        fa[i]=i;
		fa[i+n]=i+n;
	}
    for(int i=1;i<=m;i++){
        int x=cri[i].a,y=cri[i].b;
        if(find(x)==find(y)||find(x+n)==find(y+n)){
            printf("%d\n",cri[i].c);
			return 0;
        }
        fa[find(x+n)]=find(y);
        fa[find(x)]=find(y+n);
    }
	printf("0\n");
    return 0;
}
posted @ 2019-09-08 12:59  prestige  阅读(96)  评论(0编辑  收藏  举报