并查集+离散化,可惜我不会离散化。
然后我就学了学哈哈哈哈哈哈哈又会了点新东西。
用map做映射(虽然并不懂为什么用map)把所有的数都换到一个数组里去,然后手动去重(if(cnt[i]!=cnt[i-1]) Map[cnt[i]]=++sum;),放进map里去。
然后在做的时候就可以只用映射的数来并查集了。
inf[i].a=Map[inf[i].a]; inf[i].b=Map[inf[i].b];
并查集倒是很简单
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <map> #include <cstring> #include <algorithm> using namespace std; int f[3000203],t,n,flag,tot,cnt[3000203],sum; struct llo{ int a;int b;int c; } inf[3002002]; map <int,int> Map; int find(int x){ if(f[x]!=x) f[x]=find(f[x]); return f[x]; } int main(){ scanf("%d",&t); while(t--){ Map.clear(); memset(cnt,0,sizeof(cnt)); tot=0; //for(int i=1;i<=2*n;i++) // f[i]=i; flag=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&inf[i].a,&inf[i].b,&inf[i].c); cnt[++tot]=inf[i].a; cnt[++tot]=inf[i].b; } sort(cnt+1,cnt+tot+1); Map[cnt[1]]=1,sum=1; for(int i=2;i<=tot;i++) if(cnt[i]!=cnt[i-1]) Map[cnt[i]]=++sum; for(int i=1;i<=sum;i++) f[i]=i; // sort(inf) for(int i=1;i<=n;i++) if(inf[i].c==1){ inf[i].a=Map[inf[i].a]; inf[i].b=Map[inf[i].b]; int fx=find(inf[i].a); int fy=find(inf[i].b); if(fx!=fy) f[fx]=fy; } for(int i=1;i<=n;i++) if(inf[i].c==0){ inf[i].a=Map[inf[i].a]; inf[i].b=Map[inf[i].b]; int fx=find(inf[i].a); int fy=find(inf[i].b); if(fx==fy){ flag=-1; break; } } if(flag==0) printf("YES "); else printf("NO "); } return 0; }
但我一开始忘把Map和cnt数组清零了,导致一直80分。