首页 > 其他分享 >2-SAT-学习笔记

2-SAT-学习笔记

时间:2023-02-08 23:58:27浏览次数:62  
标签:int tp 笔记 st 学习 dfn ncol low SAT

基本知识复习

https://oi-wiki.org/graph/2-sat/

模板

【模板】2-SAT 问题

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e6+5;
int n,m;
int cvrt(int u, int tp) { return tp?u:u+n; }
vector<int> g[N];
int dfn[N],low[N],col[N],st[N],tp,in_st[N],ct,ncol;
void tarjan(int u)
{
	dfn[u]=low[u]=++ct;
	st[++tp]=u; in_st[u]=1;
	for(int v:g[u])
		if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
	    else if(in_st[v]) low[u]=min(low[u],dfn[v]); // 这第二个一定是 dfn[v]
    if(dfn[u]==low[u])
    {
    	ncol++; int v;
    	do { v=st[tp--],in_st[v]=0,col[v]=ncol; } while(u!=v); // 这边我写法很容易搞错 tcl
    }
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,ti,ta,tj,tb; i<=m; i++)
	{
		scanf("%d%d%d%d",&ti,&ta,&tj,&tb);
		if(ti==tj and ta!=tb) continue;
		g[cvrt(ti,!ta)].push_back(cvrt(tj,tb)); // !i->j
		if(ti==tj and ta==tb) continue;
		g[cvrt(tj,!tb)].push_back(cvrt(ti,ta)); // !j->i
	}
	for(int i=1; i<=(n<<1); i++) if(!dfn[i]) ct=0,tarjan(i);
	for(int i=1; i<=n; i++) if(col[i]==col[i+n]) { puts("IMPOSSIBLE"); return 0; } //如果 !u->u and u->!u 肯定是假的
	puts("POSSIBLE");
	for(int i=1; i<=n; i++) printf("%d ",(col[i]<col[i+n])); //肯定选拓扑序靠后的,也就是 col 小的 注意 tarjan 是反的拓扑序
	return 0;
}

例题

1

标签:int,tp,笔记,st,学习,dfn,ncol,low,SAT
From: https://www.cnblogs.com/copper-carbonate/p/17103748.html

相关文章

  • PyQt5-快速上手笔记
    窗口importsysfromPyQt5.QtWidgetsimportQApplication,QWidgetfromPyQt5.QtGuiimportQIconclassExample(QWidget):def__init__(self):super(......
  • 3-时间序列转监督学习数据
    importpandasaspdimportdatetime#加载数据defparser(x):returndatetime.datetime.strptime(x,'%Y/%m/%d')ser=pd.read_csv('../LSTM系列/LSTM单变量1......
  • spring security学习
    一:介绍1.定义SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。SpringSecurity主要实现了Authentication(认证,......
  • 自我介绍与学习记录
    |这个作业属于哪个课程|https://edu.cnblogs.com/campus/fzzcxy/2023learning?filter=homework||这个作业要求在哪里|https://edu.cnblogs.com/campus/fzzcxy/2023learnin......
  • python学习——【第四弹】
    前言上一篇文章​​python学习——【第一弹】​​中,我们了解了python当中的流程控制语句,这篇文章我们接着学习python中的序列。这篇文章先给大家介绍不可变序列字符串和可......
  • Redis课程笔记
    Redis安装前台启动后台启动1)备份redis.conf2)修改配置:deamonizeyes3)执行redis-server配置文件的目录key键操作select[dbindex]切换库keys*查所有key......
  • 机器学习模型集成管理介绍
    在本文中,我将尝试对MLOps进行友好的介绍,并以简单的方式解释关键概念。作为一开始也觉得很难理解的人,我理解有必要对这个主题进行更简单的介绍。我希望在阅读本文后,初学者......
  • 树链剖分 学习笔记
    树链剖分学习笔记树链剖分(Treedecomposition),顾名思义,是一种将树剖分为若干条链,使得可以用数据结构维护树上信息的数据结构。树链剖分有多种意思,包括重链剖分、长链剖分......
  • FL论文笔记 Hierarchically Fair Federated Learning,Shapley计算贡献
    相关笔记:https://blog.csdn.net/wuxusanren/article/details/128651334相关综述论文:《ASurveyofIncentiveMechanismDesignforFederatedLearning》《联邦学习激励......
  • 自我介绍与学习记录
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzzcxy/2023learning这个作业要求在哪里https://edu.cnblogs.com/campus/fzzcxy/2023learning/homework/1......