如果你并查集60pts
查看原帖
如果你并查集60pts
631094
liyuechuan12345楼主2025/7/22 14:44

你可能没有用种类并查集

//每次把最大冲突合并
//这竟然能拿60分??
#include<bits/stdc++.h>
using namespace std;
int fa[200050];
struct node{
    int a,b,c;
}e[200050];
bool cmp(node a,node b){
    return a.c>b.c;
}
int find(int x){
    if(x!=fa[x])fa[x]=find(fa[x]);
    return fa[x];
}
int main(){
    int n,m;
    cin>>n>>m;
    for (int i=1;i<=m;i++){
        cin>>e[i].a>>e[i].b>>e[i].c;
    }
    for (int i=1;i<=200005;i++)fa[i]=i;
    sort(e+1,e+m+1,cmp);
    for (int i=1;i<=m;i++){
        if(find(e[i].a)!=find(e[i].b)){
            fa[find(e[i].a)]=find(e[i].b);
        }
        else{
            cout<<e[i].c;
            return 0;
        }
    }
    cout<<0;
    return 0;
}

种类并查集

#include<bits/stdc++.h>
using namespace std;
int fa[200050];
struct node{
    int a,b,c;
}e[200050];
bool cmp(node a,node b){
    return a.c>b.c;
}
int find(int x){
    if(x!=fa[x])fa[x]=find(fa[x]);
    return fa[x];
}
int main(){
    int n,m;
    cin>>n>>m;
    for (int i=1;i<=m;i++){
        cin>>e[i].a>>e[i].b>>e[i].c;
    }
    for (int i=1;i<=2*n;i++)fa[i]=i;
    sort(e+1,e+m+1,cmp);
    for (int i=1;i<=m;i++){
        int x=e[i].a,y=e[i].b;
        if(find(x)!=find(y)){
            fa[find(x)]=find(y+n);
            fa[find(y)]=find(x+n);
        }
        else{
            cout<<e[i].c;
            return 0;
        }
    }
    cout<<0;
    return 0;
}
2025/7/22 14:44
加载中...