题目链接
思路:种类并查集模板题,如果i表示关,i+m就是它的对立面就是开。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn =1e5+5;
int n,m,pos,t,a[maxn],father[maxn<<1];
vector<int>g[maxn];
int findfather(int x)
{
if(x==father[x]) return x;
int i=findfather(father[x]);
father[x]=i;
return i;
}
void unit(int a,int b)
{
int fa=findfather(a),fb=findfather(b);
if(fa!=fb) father[fa]=fb;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=0;i<=2*m;++i) father[i]=i;
for(int i=1;i<=m;++i)
{
scanf("%d",&pos);
while(pos--)
{
scanf("%d",&t);
g[t].push_back(i);
}
}
for(int i=1;i<=n;++i)
{
int x=g[i][0],y=g[i][1];
if(a[i]) unit(x,y),unit(x+m,y+m);
else unit(x+m,y),unit(x,y+m);
}
for(int i=1;i<=m;++i)
if(findfather(i)==findfather(i+m)) {
puts("NO");return 0;
}
puts("YES");
}