20pts 2-SAT 模板求调
查看原帖
20pts 2-SAT 模板求调
220824
yyz1005楼主2023/3/30 10:01
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 100010<<1;
const ll M = 100010<<1;
vector<ll> vec[N];
ll n,m;
ll dfn[N],low[N],tot = 0;
bool inst[N];
stack<ll> stk;
ll cnt = 0,bel[N];
void tarjan(ll id,ll fa){
	stk.push(id);
	dfn[id] = low[id] = ++tot;
	inst[id] = true;
	for(auto v : vec[id]){
		if(dfn[v]){
			if(inst[v]) low[id] = min(low[id],dfn[v]);
		} else {
			tarjan(v,id);
			low[id] = min(low[id],low[v]);
		}
	}
	if(low[id]==dfn[id]){
		cnt++;
		while(stk.top()!=id){
			bel[stk.top()] = cnt;
			inst[stk.top()] = false;
			stk.pop();
		}
		bel[id] = cnt;
		inst[id] = 0;
		stk.pop();
	}
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(ll i = 1; i <= m; i++){
		ll u,uv,v,vv;
		scanf("%lld%lld%lld%lld",&u,&uv,&v,&vv);
		if(!uv&&!vv) vec[u+n].push_back(v),vec[v+n].push_back(u);
		if(!uv&&vv) vec[u+n].push_back(v+n),vec[v].push_back(u);
		if(uv&&!vv) vec[u].push_back(v),vec[v+n].push_back(u+n);
		if(!uv&&!vv) vec[u].push_back(v+n),vec[v].push_back(u+n);
	}
	for(ll i = 1; i <= n<<1; i++) if(!dfn[i]) tarjan(i,i);
	for(ll i = 1; i <= n; i++){
		if(bel[i]==bel[i+n]){
			puts("IMPOSSIBLE");
			return 0; 
		}
	}
	puts("POSSIBLE");
	for(ll i = 1; i <= n; i++) printf("%d ",bel[i]<bel[i+n]);
	return 0;
}
2023/3/30 10:01
加载中...