2-SAT

#include<bits/stdc++.h>
using namespace std;
const int size=1e5+10;
int 
N,M,lef[size<<1],ver[size<<1],Next[size<<1],lin[size],dfn[size],low[size],num,tot,cnt,tc,nc[size<<1],vc[size<<1],lec[size<<1],
c[size],top,head,tail,q[size<<1],opp[size],lable[size],Stack[size<<1],lc[size],rd[size];
bool vis[size];


inline int read()
{
char ch=getchar();int num=0,f=1;
while(!isdigit(ch)){if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)){num=(num<<1)+(num<<3)+ch-'0'; ch=getchar();}
return num*f;
}


void add(int x,int y)
{
ver[++tot]=y;
lef[tot]=x;
Next[tot]=lin[x];
lin[x]=tot;
}


void Add(int x,int y)
{
vc[++tc]=y;
lec[tc]=x;
nc[tc]=lc[x];
lc[x]=tc;
}


void init()
{
N=read(),M=read();N<<=1;
for(int i=1;i<=M;i++){
int x=read()-1,y=read()-1;
add(x,y^1);
add(y,x^1);
}
}


void tarjan(int x)
{
dfn[x]=low[x]=++num;
Stack[++top]=x;vis[x]=1;
for(int i=lin[x];i;i=Next[i]){
int y=ver[i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}else if(vis[y])
low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
int y;
cnt++;
do{
y=Stack[top--];
vis[y]=0;
c[y]=cnt;
}while(x!=y);
}
}


void solve()
{
memset(vis,0,sizeof(vis));
memset(lable,0,sizeof(lable));
memset(opp,-1,sizeof(opp));
for(int i=0;i<N;i++) if(!dfn[i]) tarjan(i);
for(int i=0;i<N;i++){
if(c[i]==c[i^1]){
printf("No\n");
exit(0);
}
opp[c[i]]=c[i^1];
opp[c[i^1]]=c[i];
}
for(int i=1;i<=tot;i++){
int x=lef[i],y=ver[i];
if(c[x]==c[y]) continue;
Add(c[y],c[x]);
rd[c[x]]++;
}
head=1,tail=0;
for(int i=1;i<=cnt;i++) if(rd[i]==0) q[++tail]=i;
for(;head<=tail;head++){
int x=q[head];
if(lable[x]) continue;
lable[x]=1;lable[opp[x]]=2;
for(int i=lc[x];i;i=nc[i]){
int y=vc[i];
if(--rd[y]==0) q[++tail]=y;
}
}
}


void print()
{
for(int i=0;i<N;i++) if(lable[c[i]]==1) printf("%d ",i+1);
}


int main()
{
init();
solve();
print();
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值