2-SAT模板
说在前面
证明我还活着……
每天做题做的疲于奔命,
高考课的作业又做不完。
啊啊啊啊
还有CSDN实在太**
了,越来越**
了,正在极慢速向cnblogs搬家。
天天高高兴兴打打模板
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
void Read(int &p)
{
p=0;
int f=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9')
p=p*10+c-'0',c=getchar();
p*=f;
}
const int MAXN=5*1000+20;
int N,M;
vector <int> G[MAXN];
void addedge(int u,int v)
{
G[u].push_back(v);
}
#define sz(i) G[i].size()
int scc,block;
int ins[MAXN],dfn[MAXN],low[MAXN];
stack <int> S;
void targin(int u)
{
dfn[u]=low[u]=++block;
S.push(u),ins[u]=1;
for(unsigned int i=0;i<sz(u);i++)
{
int v=G[u][i];
if(ins[G[u][i]]==0) targin(v);
if(ins[G[u][i]]==1) low[u]=min(low[u],low[v]);
}
if(dfn[u]==low[u])
{
scc++;
while(S.size()>0)
{
int v=S.top(); S.pop();
ins[v]=2; low[v]=scc;
if(u==v) break;
}
}
}
int ask_scc()
{
scc=0,block=0;
for(int i=2;i<2*N+2;i++)
if(ins[i]==0) targin(i);
return scc;
}
vector<int> lis[MAXN];
bool judge()
{
for(int i=1;i<=N;i++)
{
if(low[i<<1]==low[i<<1^1]) return printf("NO\n")*0;
lis[low[i<<1]].push_back(low[i<<1^1]),lis[low[i<<1^1]].push_back(low[i<<1]);
}
puts("YES");
return 1;
}
vector<int> dag[MAXN];
int ind[MAXN];
void ask_dag()
{
for(int u=2;u<2*N+2;u++)
for(unsigned int i=0;i<sz(u);i++)
{
int v=G[u][i];
if(low[u]!=low[v]) dag[low[v]].push_back(low[u]),ind[low[u]]++;
}
}
queue<int> q;
int vis[MAXN];
void run_topsort()
{
for(int i=1;i<=scc;i++)
if(ind[i]==0) q.push(i);
while(!q.empty())
{
int u=q.front(); q.pop();
if(!vis[u])
{
vis[u]=1;
for(unsigned int i=0;i<lis[u].size();i++)
vis[lis[u][i]]=2;
}
for(unsigned int i=0;i<dag[u].size();i++)
{
int v=dag[u][i]; ind[v]--;
if(!ind[v]) q.push(v);
}
}
}
void ans_print()
{
for(int i=1;i<=N;i++)
if(vis[low[i<<1]]==1) printf("something\n");
else printf("something\n");
}
#define Clear(x) memset(x,0,sizeof x)
void init()
{
scc=block=0;
while(!S.empty()) S.pop();
while(!q.empty()) q.pop();
for(int i=0;i<MAXN;i++) G[i].clear();
for(int i=0;i<MAXN;i++) dag[i].clear();
for(int i=0;i<MAXN;i++) lis[i].clear();
Clear(dfn); Clear(low); Clear(ins); Clear(ind);
}
int main()
{
init();
ask_scc();
if(!judge()) return 0;
ask_dag();
run_topsort();
ans_print();
}