关押罪犯 叕是并查集

Luogu1525 关押罪犯

Luogu1525 NOIP2010 关押罪犯の传送门

先排序
要知道,敌人的敌人是朋友
其实是可以证的啦

Code

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;

const int N = 20007;
int n, m, fa[N], b[N];
struct ig{
    int x, y, val;
} a[100007];

inline bool cmp(ig a, ig b){
    return a.val > b.val;
}
inline int read(){
    int ans = 0, f = 1;
    char ch = getchar();
    for(; ch < '0' || ch > '9'; ch = getchar())
        if (ch == '-')
            f = 0;
    for(; ch >= '0' && ch <= '9'; ch = getchar())
        ans = (ans << 3) + (ans << 1) + ch - 48;
    return f? ans: -ans;
}
int find(int x){
    if (fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}
int main(){
    n = read(), m = read();
    for (int i = 1; i <= m; ++i)
        a[i].x = read(), a[i].y = read(), a[i].val = read();
    sort(a + 1, a + 1 + m, cmp);
    for (int i = 1; i <= n; ++i)
        fa[i] = i;
    for (int i = 1; i <= m; ++i){
        int fx = find(a[i].x), fy = find(a[i].y);
        if (fx == fy){
            printf("%d\n", a[i].val);
            return 0;
        }
        else{
            if (!b[a[i].x])
                b[a[i].x] = a[i].y;
            else{
                int fz = find(b[a[i].x]);
                fa[fy] = fz;
            }
            if (!b[a[i].y])
                b[a[i].y] = a[i].x;
            else{
                int fz = find(b[a[i].y]);
                fa[fx] = fz;
            }
        }
    }
    printf("0\n");
    return 0;
}

本来我还想yy如果有k座监狱的话可不可做
有两位神犇告诉我,
这样的话是NPC问题
只有1和2的case是求图的色数**

猜你喜欢

转载自www.cnblogs.com/df015/p/9829874.html
今日推荐