AcWing 237. 程序自动分析

算法

并查集+离散化

思路

离散化

sort(l,l+tot);
        int start=unique(l,l+tot)-l; 
        for(int i=1;i<=n;++i){
           a[i].x=lower_bound(l,l+start,a[i].x)-l;
           a[i].y=lower_bound(l,l+start,a[i].y)-l;   
        } 

并查集

相等的在一个集合

注意

要先处理相等

代码

#include <bits/stdc++.h> 
using namespace std;
int t,n,f[1000005],l[1000007*3];
inline long long read(){
	long long num=0;int z=1;char c=getchar();
	if(c=='-') z=-1;
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	if(c=='-') z=-1,c=getchar();
	while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
	return z*num;
}
struct node{
    int x,y,e;
}a[1000001];  
bool cmp(node a,node b){
    return a.e>b.e;
}
inline void pre(int o){
    for(int i=1;i<=o;i++)  f[i]=i;
} 
int get(int x){
    if(x==f[x]) return x;
    return f[x]=get(f[x]);
}
int main(){
    t=read();
    while(t--){
      int tot=-1;
      memset(l,0,sizeof(l));
      memset(a,0,sizeof(a));
      memset(f,0,sizeof(f));
    int flag=1;
        n=read();

        for(int i=1;i<=n;i++){
            a[i].x=read();a[i].y=read();a[i].e=read();
            l[++tot]=a[i].x;
            l[++tot]=a[i].y;
        }
        sort(l,l+tot);
        int start=unique(l,l+tot)-l; 
        for(int i=1;i<=n;++i){
           a[i].x=lower_bound(l,l+start,a[i].x)-l;
           a[i].y=lower_bound(l,l+start,a[i].y)-l;   
        } 
        pre(start);   
        sort(a+1,a+n+1,cmp); 
        for(int i=1;i<=n;i++){
            int r1=get(a[i].x);
            int r2=get(a[i].y);
            if(a[i].e){
                f[r1]=r2;  
            }
			else if(r1==r2){
                printf("NO\n");
                flag=0; 
                break;
            }
        }
        if(flag)printf("YES\n");
    }
    return 0;
}

  

 

posted @ 2020-04-18 16:49  人生有味是清欢  阅读(159)  评论(0编辑  收藏  举报