加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

2010提高组-C]关押罪犯(扩展域并查集

发布时间:2020-12-16 09:16:23 所属栏目:百科 来源:网络整理
导读:题:https://www.cometoj.com/problem/0073 ? #includebits/stdc++.h using namespace std; const int M=1e5+ 4 ; struct node{ int u,v,w;}e[M]; int f[M]; bool cmp(node p,node q){ return p.w q.w;} int find( int x){ return f[x]==x?x:f[x]= find(f[x]

题:https://www.cometoj.com/problem/0073

?

#include<bits/stdc++.h>
using namespace std;
const int M=1e5+4;
struct node{
    int u,v,w;
}e[M];
int f[M];
bool cmp(node p,node q){
    return p.w>q.w;
}
int find(int x){
    return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    }
    sort(e+1,e+1+m,cmp);
    for(int i=1;i<=2*n;i++)
        f[i]=i;
    for(int i=1;i<=m;i++){
        int u=e[i].u,v=e[i].v;
        int uu=e[i].u+n,vv=e[i].v+n;
        int a=find(u),b=find(v);
        int aa=find(uu),bb=find(vv);
        if(a==b){
            return printf("%dn",e[i].w),0;
        }
        else {
            if(a!=bb)
                f[a]=bb;
            if(aa!=b)
                f[aa]=b;
        }
    }
    printf("0n");
    return 0;
}
View Code

?

把每个人拆成两个点分别表示与这个人一个监狱的集合和与这个人不同监狱的集合即可。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读