WA 10pts 悬赏互关(简单易懂)
查看原帖
WA 10pts 悬赏互关(简单易懂)
709447
tx774楼主2023/8/28 21:31

rt

记录

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int fa[N];
struct data{
	int x,y,e;
}a[N];
bool cmp_sort(data x,data y){return x.e>y.e;}
int find(int x)
{return fa[x]==x?x:fa[x]=find(fa[x]);}
int T,n;
int main()
{
	cin>>T;
	while(T--)
	{
		int b[N];
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(fa,0,sizeof(fa));
		cin>>n;int tot=0;
		for(int i=1;i<=n;++i)
		{
			cin>>a[i].x>>a[i].y>>a[i].e;
			b[++tot]=a[i].x;//记录这些值
			b[++tot]=a[i].y;
		}
		sort(b+1,b+1+tot);
		int tott=unique(b+1,b+1+tot)-b;
		//algorithm中的函数,把数组去重,然后返回末尾指针。这里减一个b就可以表示b现在的大小了
		for(int i=1;i<=n;++i)
		{
			a[i].x=lower_bound(b+1,b+1+tott,a[i].x)-b;//十分实用的lower_bound,寻找b中>=a[i].x的第一个数的指针
			//(因为a[i].x在b中一定存在,所以是直接求出a[i].x离散化后对应的值),减去b就是它的位置。
			a[i].y=lower_bound(b+1,b+1+tott,a[i].y)-b;
		}
		
		for(int i=1;i<=tott;++i) fa[i]=i;
		sort(a+1,a+1+n,cmp_sort);
		bool ck=1;
		for(int i=1;i<=n;++i)
		{
			if(a[i].e==1 && (find(a[i].x)!=find(a[i].y)))
				fa[find(a[i].x)]=a[i].y;
			else 
				if(find(a[i].x)==find(a[i].y))
				{ck=0;break;}
		}
		ck==1?cout<<"YES"<<endl:cout<<"NO"<<endl;
	}
    return 0;
}
2023/8/28 21:31
加载中...