struct twoset{
int n;
bool mark[N<<1];
int S[N<<1],c;
vector<int > g[N<<1];
vector<int >ttmp;
bool dfs(int x)
{
if (mark[x^1]) return 0;
if (mark[x]) return 1;
mark[x]=1;
S[c++]=x;
for (int i=0;i<g[x].size();i++)
if (!dfs(g[x][i])) return 0;
return 1;
}
void init(int nn)
{
n=nn;
ttmp.clear();
for (int i=0;i<nn*2;i++)
g[i].clear();
memset(mark,0,sizeof(mark));
}
void add(int x,int xval,int y,int yval)//x==xval or y==yval
{ x=x*2+xval;
y=y*2+yval;
g[x^1].pb(y);
g[y^1].pb(x);
}
void set(int x,int xval)
{ x=x*2+xval;
ttmp.pb(x);
}
void unsetlast()
{
ttmp.pop_back();
}
//2*k :state[k]=false;
//2*k+1 :state[k]=true;
bool solve()
{ memset(mark,0,(n*2)*sizeof(bool));c=0;
for (int i=0;i<ttmp.size();i++)
if (!dfs(ttmp[i])) return 0;
for (int i=0;i<n*2;i+=2)
if (!mark[i]&&!mark[i+1])
{
c=0;
if (!dfs(i))
{
while (c>0) mark[S[--c]]=0;
if (!(dfs(i+1))) return 0;
}
}
return 1;
}
}it;
##TwoSet##
最新推荐文章于 2022-05-19 10:19:47 发布