点的序号很大,存不过来,但点数较少,因此用离散化,然后再用并查集。
用map进行离散化,过8个点,2个超时
代码:
#include<iostream> #include<cstring> #include<algorithm> #include<map> #define Size 1000005*2 using namespace std; map<int,int> dic; struct IN{ int x,y,e; }data[Size]; int f[Size*2]; int en[Size][2]; int cnt=0; int n; bool flag; int pa[Size]; void init(){ for(int i=1;i<Size;i++)pa[i]=i; memset(en,0,sizeof(en)); } int find(int x){ if(x!=pa[x])pa[x]=find(pa[x]); return pa[x]; } bool query(int x,int y){ return find(x)==find(y); } void un(int x,int y){ if(query(x,y))return; pa[find(x)]=find(y); } int main(){ int T;cin>>T; while(T--){ flag=true; cnt=0; init(); cin>>n; for(int i=1;i<=n;i++){ cin>>data[i].x>>data[i].y>>data[i].e; f[2*i-1]=data[i].x; f[2*i]=data[i].y; } sort(f+1,f+1+n*2); for(int i=1;i<=n*2;i++){ if(f[i]!=f[i-1]){ cnt++; dic[f[i]]=cnt; } } int e,x,y; int num=0; for(int i=1;i<=n;i++){ x=dic[data[i].x]; y=dic[data[i].y]; e=data[i].e; if(e==1)un(x,y); else{ num++; en[num][0]=x; en[num][1]=y; } } for(int i=1;i<=num;i++){ x=en[i][0]; y=en[i][1]; if(query(x,y)){ flag=false; break; } } if(flag)cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
原文:http://www.cnblogs.com/FuTaimeng/p/5606109.html