判断是否存在两个属于一集合却又关系
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
const int MAXN=2010;
int F[MAXN];
int val[MAXN];
int find(int x)
{
if(F[x]==-1)return x;
int tmp=find(F[x]);
val[x]+=val[F[x]];
val[x]%=2;
return F[x]=tmp;
}
int main()
{
int T;
int n,m;
scanf("%d",&T);
int iCase=0;
while(T--)
{
iCase++;
memset(F,-1,sizeof(F));
memset(val,0,sizeof(val));
scanf("%d%d",&n,&m);
bool flag=true;
int u,v;
while(m--)
{
scanf("%d%d",&u,&v);
if(!flag)continue;
int t1=find(u),t2=find(v);
if(t1==t2)
{
if(val[u]==val[v])flag=false;
}
else
{
F[t1]=t2;
val[t1]=val[v]-val[u]+1;
val[t1]%=2;
}
}
if(flag)printf("NO\n\n",iCase);
else printf("YES\n\n",iCase);
}
return 0;
}
本文介绍了一种算法,用于判断同一集合内的元素是否存在特定关系。通过并查集和路径压缩技术,该算法能有效处理元素间的关系判断,避免了直接比较带来的复杂度。适用于需要判断元素间关系的场景。
2184

被折叠的 条评论
为什么被折叠?



