哈希表70分WA求助
查看原帖
哈希表70分WA求助
147670
金珂拉楼主2021/4/30 13:40

567炸掉了() 找了半天错估计是并查集的问题

#include<bits/stdc++.h>
using namespace std;
struct hash_dsu{
	struct node{
		long long fa,fid,r,val,id,nt;
	} v[5000003];
	long long p=1000007;
	int tot,h[2000010];	
	queue<int> q;
	int New(long long x){
				tot++;
				v[tot]={x,tot,1,x,tot,h[(x-1)%p+1]}; 
				if(!h[(x-1)%p+1]) q.push((x-1)%p+1);
				h[(x-1)%p+1]=tot;
				return tot;
		}
	int take(long long x){
		int i=h[(x-1)%p+1];
		while(v[i].val!=x && i!=0) i=v[i].nt;
		if(i==0) return New(x);
		return i;
		}
	node getfather(int x){return (x==v[x].fid)? v[x] : v[v[x].fid]=getfather(v[x].fid);}
	int get(int x){node temp=getfather(x);return temp.id;}
	void merge(long long a,long long b){
		int x=take(a),y=take(b);
		int fx=get(x),fy=get(y);
		if(fx==fy) return; 
		if(v[fx].r>v[fy].r) swap(fx,fy);
		v[fx].fid=fy;
		v[fx].fa=v[fy].val;
		v[fy].r+=v[fx].r;
	}	
	void clr()
	{
		tot=0;
		while(!q.empty())
		{
			int x=q.front();
			q.pop();
			h[x]=0;
		}
		v[0]={0,0,0,0,0,0};
	}
		int init()
	{
		tot=0;
	}
	int check(long x,long y){if(get(take(x))==get(take(y))) return 1;return 0;}
	int num(int x){return getfather(x).r;}
} DSU;
pair<int,int> a[1000003];
int top=0;
void add(int x,int y)
{
	top++;
	a[top]={x,y};
}
int main()
{ 
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		DSU.clr();
		top=0;
		int bo=1;
		int n;
		scanf("%d",&n);

		for(int j=1;j<=n;j++)
		{
			
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			if(z==1)
			{
				/*if(x!=y)*/ DSU.merge(x,y);
			} 
			else /*if(x!=y)*/add(x,y);
		//	cout<<x<<' '<<y<<' '<<DSU.get(DSU.take(2))<<' '<<DSU.get(DSU.take(9))<<' '<<DSU.check(2,9)<<' '<<DSU.get(DSU.take(2))<<' '<<DSU.get(DSU.take(9))<<endl;
		}
	for(int j=1;j<=top;j++)
	{
		if(DSU.check(a[j].first,a[j].second) && bo)
		{
			bo=0;
		}
	}
	if(bo) puts("YES");
	else puts("NO");
	}
	return 0;
}
2021/4/30 13:40
加载中...