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; }
细雨斜风作晓寒,
淡烟疏柳媚晴滩。
入淮清洛渐漫漫。
雪沫乳花浮午盏,
蓼茸蒿笋试春盘。
人间有味是清欢。