题意:给你n对x,y,你知道xy是否相等,问能否构成合法序列。n<=1e6,x,y<=1e9.
思路:很明显是一个并查集的题目,当xy相等时为一个集合。需要注意的是因为xy很大所以要离散化,
我用的是map离散化,刚开始用迭代器t了!!!
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<queue> #include<cmath> #define ll long long using namespace std; map<int,int> mp; struct point { int x; int y; int z; }a[1000010]; int fa[2000010]; int get(int k) { return fa[k]==k?k:fa[k]=get(fa[k]); } void merge(int x,int y) { fa[get(x)]=get(y); } bool cmp(point a,point b) { return a.z>b.z; } int main() { int t; while(~scanf("%d",&t)) { while(t--) { int n; mp.clear(); scanf("%d",&n); int m=1; for(int i=0;i<n;i++) { scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); if(mp[a[i].x]==0) { mp[a[i].x]=m; a[i].x=m; m++; } else { a[i].x=mp[a[i].x]; } if(mp[a[i].y]==0) { mp[a[i].y]=m; a[i].y=m; m++; } else { a[i].y=mp[a[i].y]; } // printf("x:%d y:%d ",a[i].x,a[i].y); } /* int m=1; for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++) { mp[it->first]=m; m++; }*/ for(int i=1;i<=m;i++) { fa[i]=i; } int flag=0; sort(a,a+n,cmp); for(int i=0;i<n;i++) { int u=get(a[i].x); int v=get(a[i].y); // printf("x:%d fa:%d ",a[i].x,u); // printf("y:%d fa:%d ",a[i].y,v); if(a[i].z==1) { merge(u,v); } else { if(u==v) { flag=1; break; } } } if(flag) printf("NO "); else printf("YES "); } } }