离散+并查集求助
查看原帖
离散+并查集求助
490978
小超手123楼主2022/8/19 21:45
#include<bits/stdc++.h>
using namespace std;
int n,t;
struct node {
	int ii,jj,ee;
} q[3000006];
int d[3000006],c[3000006],dtop,ctop,fa[3000006];
int find(int x) { //查找父节点
	if(fa[x]!=x)return fa[x]=find(fa[x]);
	else return x;
}
void join(int x,int y) { //合并两个集合
	int fx=find(x),fy=find(y);
	if(fx!=fy)fa[fx]=fy;
}
int main() {
	cin>>t;
	while(t--) {
		dtop=ctop=0;
		memset(d,0,sizeof(d));
		memset(c,0,sizeof(c));
		memset(fa,0,sizeof(fa));
		cin>>n;
		for(int i=1; i<=n; i++) {
			cin>>q[i].ii>>q[i].jj>>q[i].ee;
			if(q[i].ee==1)d[++dtop]=q[i].ii,d[++dtop]=q[i].jj;
		}
		sort(d+1,d+dtop+1);
		for(int i=1; i<=dtop; i++)
			if(i==1||d[i]!=d[i-1])c[++ctop]=d[i]; //去重
		//离散化
		for(int i=1; i<=ctop; i++)fa[i]=i;
		for(int i=1; i<=n; i++) {
			if(q[i].ee==1) { //等于
				int x=lower_bound(c+1,c+ctop,q[i].ii)-c;
				int y=lower_bound(c+1,c+ctop,q[i].jj)-c;
				join(x,y);
			}
		}
		bool flag=1;
		for(int i=1; i<=n; i++) {
			if(q[i].ee==0) { //不等于
				if(find(q[i].ii)==find(q[i].jj)) {
					flag=0;
					break;
				}
			}
		}
		if(flag==1)cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

看了很久也没看出哪里有问题,RE了一个点,WA了7个点,各位大佬们帮忙看看吧

2022/8/19 21:45
加载中...