为什么WA了4个点,还RE了1个点???
查看原帖
为什么WA了4个点,还RE了1个点???
178195
人间温柔楼主2020/6/27 18:58

我是最近刚刚开始学习并查集的。有些事情可能还不是特别明白。

现在求助的这道题,我就是用并查集做的。

思路

  1. 首先按照要求读入,若遇到xi=xjx_i=x_j并且e=0e=0的情况直接输出NO
  2. 当数据活过上述情况时,对所有数据按照ee从大到小排序,即e=1e=1的数据在前面
  3. 若某一行数据形似xi xj 1x_i\ x_j\ 1,那么将xix_i设为xjx_j的父亲
  4. 若某一行数据形似xi xj 0x_i\ x_j\ 0,那么进行查找操作,若xix_ixjx_j没有公共祖先,那么输出NO
  5. 当数据活过上述所有情况时,输出YES

【代码】

#include<bits/stdc++.h>
using namespace std;

struct num{
	int x,y,e;
};
int fa[1000010];

bool cmp(num p,num q)
{
	return p.e > q.e;
}

int find(int x)
{
	if(fa[x]==x) return x;
	fa[x]=find(fa[x]);
	return fa[x];
}

int main()
{
    int t;
	 cin>>t;
	 while(t--)
	 {
	    bool flag=true,flag2=true;
    	int n;
    	num a[1000005];
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i].x>>a[i].y>>a[i].e;
    		if(a[i].x == a[i].y && a[i].e==0)
    		{
    			cout<<"NO";
    			flag=false;
    			break;
    		}
    	}
    	sort(a+1,a+n+1,cmp);
    	for(int i=1;i<=n && flag==true;i++)
    	{
    		int xx=find(a[i].x);
    		int yy=find(a[i].y);
    		if(a[i].e==1)
    			if(xx!=yy)
    				fa[a[i].y]=a[i].x;
    		else if(xx==yy)
    		{
    			cout<<"NO";
    			flag2=false;
    			break;
    		}
    	}
    	if(flag==true && flag2==true) cout<<"YES";
    	cout<<endl;
	}
	return 0;
}
2020/6/27 18:58
加载中...