一个并查集的问题,求大佬解答!
查看原帖
一个并查集的问题,求大佬解答!
269789
komatsu1137楼主2020/11/1 15:22
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 20010, M = 100010;
int p[N], n, m, enemy[N];
struct Node {
    int a, b, w;
    bool operator < (const Node &t) const {
        return w > t.w;
    }
} e[M];
int find(int x) {
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}
void merge(int a, int b) {
    p[find(a)] = find(b);
}
int main() {
    cin>>n>>m;
    for(int i = 1; i <= n; i++) 
        p[i] = i;
    for(int i = 1; i <= m; i++) {
        int a, b, w;
        cin>>a>>b>>w;
        e[i] = {a, b, w};
    }
    sort(e + 1, e + m + 1);

    for(int i = 1; i <= m; i++) {
        if(find(e[i].a) == find(e[i].b)) {
            cout<<e[i].w<<endl;
            return 0;
        }
        if(!enemy[e[i].a]) enemy[e[i].a] = e[i].b; 
        else merge(enemy[e[i].a], e[i].b);//问题在这里
        if(!enemy[e[i].b]) enemy[e[i].b] = e[i].a;
        else merge(enemy[e[i].b], e[i].a);
    }
    cout<<0<<endl;

    return 0;
}

为什么把

 if(!enemy[e[i].a]) enemy[e[i].a] = e[i].b;
    else merge(enemy[e[i].a], e[i].b);

改成

 if(!enemy[e[i].a]) enemy[e[i].a] = e[i].b;
    else merge(enemy[e[i].b], e[i].a);

就过不了了呢?

2020/11/1 15:22
加载中...