并查集+离散化

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集+离散化相关的知识,希望对你有一定的参考价值。

#952. 程序自动分析
再也不想用memset了,总超时,改了好久,有点小烦!!!

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e6+5;
int n,f[N],d[N],cnt;
bool flag;
struct node

    int x,y,z;
    bool operator<(const node &a)const
        return z>a.z;
    
e[N];
int r_find(int r)

    if(r==f[r])return f[r];
    f[r]=r_find(f[r]);
    return f[r];

signed main()

    int t;scanf("%lld",&t);
    while(t--)
    
        cnt=flag=0;
        scanf("%lld",&n);
        for(int i=1;i<=n*2;i++)
            f[i]=i;
        for(int i=1;i<=n;i++)
        
            scanf("%lld%lld%lld",&e[i].x,&e[i].y,&e[i].z);
            d[++cnt]=e[i].x;
            d[++cnt]=e[i].y;
        
        sort(d+1,d+cnt+1);
        sort(e+1,e+n+1);
        int temp=unique(d+1,d+cnt+1)-d-1;
        for(int i=1;i<=n;i++)
        
            if(e[i].z)
            
                int a=lower_bound(d+1,d+1+temp,e[i].x)-d;
                int b=lower_bound(d+1,d+1+temp,e[i].y)-d;
                int fx=r_find(a),fy=r_find(b);
                f[fx]=fy;
            
            else 
            
                int a=lower_bound(d+1,d+1+temp,e[i].x)-d;
                int b=lower_bound(d+1,d+1+temp,e[i].y)-d;
                int fx=r_find(a),fy=r_find(b);
                if(fx==fy)
                
                    flag=1;break;
                
            
        
        if(flag)
            printf("NO\\n");
        else
            printf("YES\\n");

    
    return 0;


以上是关于并查集+离散化的主要内容,如果未能解决你的问题,请参考以下文章

并查集+离散化

POJ - 1733 离散化 并查集

1034. Head of a Gang (30) -string离散化 -map应用 -并查集

51Nod 1515(并查集set离散化)

acwing 237 程序自动分析 [离散化+并查集]

poj1733(种类并查集+离散化)