您的位置:首页 > 其它

大连现场赛A题,匹配并查集

2016-10-27 17:53 141 查看
#include<iostream>//考察并差集的一道非常好的题目。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,x,y;
int xi[1005],yi[1005];
int par[1005],val[1005],map[1005],s[1005];
bool flag;
void init()
{
int i;
flag=true;
for(i=1;i<=n;i++)
{
par[i]=i;
val[i]=0;
map[i]=0;
s[i]=-1;
}
}
int find(int num,int &rel)
{
if(par[num]==num)
{
rel=0;
return num;
}
int fa,relt;
fa=find(par[num],relt);
val[num]=val[num] ^relt;
par[num]=fa;
rel=val[num];
return fa;
}
int update(int px,int py)
{
int xx,yy,valx,valy,rel;
xx=find(px,valx);
yy=find(py,valy);
rel=valx^valy;
if((xx==yy)&&(!rel))
return false;
if(xx!=yy)
{
par[xx]=yy;
val[xx]=rel^1;
}
return true;
}
int sett(int a)
{
int fa,rela;
fa=find(a,rela);
if(s[fa]>=0&&s[a]>=0)
return(s[fa]^s[a])==rela;
else if(s[fa]==-1)
s[fa]=s[a]^rela;
return true;
}
int main()
{
int i,px,py;
while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
{
init();
for(i=0;i<m;i++)
{
scanf("%d%d",&px,&py);
if(flag)
{
map[px]=map[py]=1;
flag=flag&&update(px,py);
}
}
for(i=0;i<x;i++)
{
scanf("%d",&px);
if(s[px]==0)flag=false;
s[px]=1;
if(flag)
flag=flag&&sett(px);
}
for(i=0;i<y;i++)
{
scanf("%d",&py);
if(s[py]==1)flag=false;
s[py]=0;
if(flag)
flag=flag&&sett(py);
}
for(i=1;(i<=n)&&flag;i++)
flag=flag&&(s[i]!=-1||map[i]!=0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: