蒟蒻2-SAT模板求调 10pts
查看原帖
蒟蒻2-SAT模板求调 10pts
715233
Dino_chx楼主2023/6/15 14:44
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+7;
vector<int> g[N];
stack<int>s;
int n,m;
int dfn[N],vis[N],low[N],color[N],num[N],colornum,cnt;
void paint(int x)
{
	s.pop();
	color[x]=colornum;
	num[colornum]++;
	vis[x]=0;
	return;
}
void tarjan(int x)
{
	dfn[x]=low[x]=++cnt;
	s.push(x);
	vis[x]=true;
	for(auto q:g[x])
	{
		if(!dfn[q])
		{
			tarjan(q);
			low[x]=min(low[x],low[q]);
		}
		else if(vis[q])
			low[x]=min(low[x],dfn[q]);
	}
	if(low[x]==dfn[x])
	{
		colornum++;
		while(s.top()!=x)
		{
			int t=s.top();
			paint(t);
		}
		paint(x);
	}
	return;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int a,pa,b,pb;
		scanf("%d%d%d%d",&a,&pa,&b,&pb);
        g[a+n*(pa&1)].push_back(b+n*(pb^1));
        g[b+n*(pb&1)].push_back(a+n*(pa^1));      
	}
	for(int i=1;i<=(n<<1);i++)
	{
		if(!dfn[i])
			tarjan(i);
	}
	for(int i=1;i<=n;i++)
	{
		if(color[i]==color[i+n])
		{
			puts("IMPOSSIBLE");
			return 0;
		}
	}
	puts("POSSIBLE");
	for(int i=1;i<=n;i++)
	{
		if(color[i]>color[i+n])
			printf("1 ");
		else
			printf("0 "); 
	}
	return 0;
}
2023/6/15 14:44
加载中...