zoukankan      html  css  js  c++  java
  • NOIP2010 关押罪犯

    题意简化

    传送门
    有两座监狱,n个罪犯,给定m组罪犯之间的关系,若此二人在同一监狱则会产生摩擦
    求最小化最大的摩擦
    $ n<=20000 m<=100000 $

    题解

    看到这一类似的题,按照经验
    先是排一遍序
    然后按照摩擦值从大到小的顺序
    把每个关系都用并査集连一下
    (注意连边的方向)
    知道第一次连到已经连通的点时,当前边权就是答案

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,en[20001],fa[20001];
    struct pig{
        int x,y,w;
    }a[100001];
    inline int cmp(pig a,pig b)
    {
        if(a.w>b.w)return 1;
        return 0;
    }
    inline int father(int x)
    {
        if(fa[x]!=x)fa[x]=father(fa[x]);
        return fa[x];
    }
    inline bool check(int x,int y)
    {
        if(father(x)==father(y))return 1;
        return 0;
    }
    inline void merge(int x,int y)
    {
        x=father(fa[x]);
        y=father(fa[y]);
        fa[x]=y;
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)fa[i]=i;
        for(int i=1;i<=m;i++)
        cin>>a[i].x>>a[i].y>>a[i].w;
        sort(a+1,a+1+m,cmp);
        for(int i=1;i<=m+1;i++)
        {
            if(check(a[i].x,a[i].y)){
                cout<<a[i].w;return 0;
            }
            else
            {
                int x=a[i].x,y=a[i].y;
                if(en[x]==0)en[x]=y;
                else merge(en[x],y);
                if(en[y]==0)en[y]=x;
                else merge(en[y],x);
            }
        }
        cout<<0;
        return 0;
    }
    
    
  • 相关阅读:
    Tinkoff Challenge
    Uva 12298 超级扑克2
    BZOJ 1031 字符加密
    HDU 4944 逆序数对
    51nod 1215 数组的宽度
    LA 3126 出租车
    LA 3415 保守的老师
    51nod 1275 连续子段的差异
    Uva 11419 我是SAM
    LA 4043 最优匹配
  • 原文地址:https://www.cnblogs.com/yzhx/p/10804313.html
Copyright © 2011-2022 走看看