2-sat(模板)
题目
再次吐糟2-sat诡奇的建图
#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
const int maxn=2000005;
using namespace std;
template<typename T>inline void rd(T&x)
{
char c;bool f=0;
while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
x=c^48;
while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
if(f)x=-x;
}
int n,m,tot,col,k,belong[maxn],hd[maxn],dfn[maxn],low[maxn];
struct node{
int fr,to,nt;
}e[maxn<<1];
stack<int>s;
inline void tarjan(int u)
{
s.push(u);
dfn[u]=low[u]=++tot;
for(int i=hd[u];i;i=e[i].nt)
{
int v=e[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!belong[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
int v=-1;++col;
while(u!=v)
{
v=s.top();
s.pop();
belong[v]=col;
}
}
}
inline void add(int x,int y)
{
e[++k].fr=x;e[k].to=y;e[k].nt=hd[x];hd[x]=k;
}
int main()
{
int a,b,c,d;
rd(n),rd(m);
inc(i,1,m)
{
rd(c),rd(a),rd(d),rd(b);
add((!a)*n+c,b*n+d);
add((!b)*n+d,a*n+c);
}
inc(i,1,n<<1)
if(!dfn[i])tarjan(i);
inc(i,1,n)
if(belong[i]==belong[i+n])
{
printf("IMPOSSIBLE");
re 0;
}
printf("POSSIBLE\n");
inc(i,1,n)
printf("%d ",belong[i]>belong[i+n]);
re 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!