【图论】2-SAT

news/发布时间2024/5/18 12:21:31

参考资料:2-SAT学习笔记

什么是2-SAT问题呢?

(¬a∨b∨¬c)∧(a∨b∨¬c)∧(¬a∨¬b∨c),给出一个类似于这样的式子,让你找出满足条件的一个解,这样的问题就是SAT问题,因为每一个括号内都有三个被限制的变量,所以这叫做3-SAT问题(是因为括号内的变量数有3个才叫3-SAT,不是因为abc才叫3-SAT)

所以2-SAT也很好理解,(¬a∨b)∧(a∨c)∧(¬c∨¬b)就叫做 2-SAT 问题

可以证明 3-SAT 及以上的问题只能用暴力枚举解决(我也不知道怎么证明),所以我们只讨论2-SAT问题

理论知识

前置知识,你需要学会【图论】有向图的强连通分量

我们将 a V b 理解成:选择了a就不能选b,选择了b就不能选aa b必须要选择一个

那我们就可以得到这样的关系:选择了a就要选择¬b, 选择了b就要选择¬a,反之也成立

根据这个关系建图,我们可以得到

在这里插入图片描述

我们可以看出,所有在一个强连通分量里的元素是等价的

因此,建好图之后,只要出现 x¬x 在一个强连通分量里,就说明它们等价,也就出现了矛盾,无解

接下来是一道洛谷的模板题

例题

P4782 【模板】2-SAT

题目链接

题目描述

n n n 个布尔变量 x 1 x_1 x1 ∼ \sim x n x_n xn,另有 m m m 个需要满足的条件,每个条件的形式都是 「 x i x_i xitrue / false x j x_j xjtrue / false」。比如 「 x 1 x_1 x1 为真或 x 3 x_3 x3 为假」、「 x 7 x_7 x7 为假或 x 2 x_2 x2 为假」。

2-SAT 问题的目标是给每个变量赋值使得所有条件得到满足。

输入格式

第一行两个整数 n n n m m m,意义如题面所述。

接下来 m m m 行每行 4 4 4 个整数 i i i, a a a, j j j, b b b,表示 「 x i x_i xi a a a x j x_j xj b b b」( a , b ∈ { 0 , 1 } a, b\in \{0,1\} a,b{0,1})

输出格式

如无解,输出 IMPOSSIBLE;否则输出 POSSIBLE

下一行 n n n 个整数 x 1 ∼ x n x_1\sim x_n x1xn x i ∈ { 0 , 1 } x_i\in\{0,1\} xi{0,1}),表示构造出的解。

样例输入 #1

3 1
1 1 3 0

样例输出 #1

POSSIBLE
0 0 0

提示

1 ≤ n , m ≤ 1 0 6 1\leq n, m\leq 10^6 1n,m106 , 前 3 3 3 个点卡小错误,后面 5 5 5 个点卡效率。

由于数据随机生成,可能会含有( 10 0 10 0)之类的坑,但按照最常规写法的写的标程没有出错,各个数据点卡什么的提示在标程里。

code

#include <bits/stdc++.h>using namespace std;signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int n, m;cin >> n >> m;vector<vector<int>> g(2 * n + 1);for (int i = 1; i <= m; i ++ ){int a, va, b, vb;cin >> a >> va >> b >> vb;g[a + !va * n].push_back(b + vb * n);g[b + !vb * n].push_back(a + va * n);// 下面四行和上两行等价// if (va && vb) g[a].push_back(b + n), g[b].push_back(a + n);// else if (va && !vb) g[a].push_back(b), g[b + n].push_back(a + n);// else if (!va && vb) g[a + n].push_back(b + n), g[b].push_back(a);// else if (!va && !vb) g[a + n].push_back(b), g[b + n].push_back(a);}vector<int> dfn(2 * n + 1), low(2 * n + 1), id(2 * n + 1);vector<bool> in_stk(2 * n + 1);int timestamp = 0, scc_cnt = 0;stack<int> stk;function<void(int)> tarjan = [&](int u){dfn[u] = low[u] = ++ timestamp; // 先将dfn和low都初始化为时间戳stk.push(u), in_stk[u] = true; // u加入栈中for (int i = 0; i < g[u].size(); i ++ ){int j = g[u][i]; // 取出u的所有邻点jif (!dfn[j]) // 如果j还没被遍历{tarjan(j);low[u] = min(low[u], low[j]); // 用low[j]更新low[u]}else if (in_stk[j]) low[u] = min(low[u], dfn[j]); // 如果j已入栈 则用dfn[j]更新low[u]}if (dfn[u] == low[u]) // 如果该点是所在强连通分量的最高点{++ scc_cnt; // 强连通分量数量加一int y;do {y = stk.top(); // 取出栈顶元素stk.pop();in_stk[y] = false;id[y] = scc_cnt; // 标记每个点所在的连通分量编号} while (y != u); // 直到取到此连通分量的最高点为止}};for (int i = 1; i <= 2 * n; i ++ )if (!dfn[i]) tarjan(i);for (int i = 1; i <= n; i ++ )if (id[i] == id[i + n]){cout << "IMPOSSIBLE\n";return 0;}cout << "POSSIBLE\n";for (int i = 1; i <= n; i ++ )if (id[i] > id[i + n]) cout << 1 << ' ';else cout << 0 << ' ';cout << '\n';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/joGR/2552.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

【扩散模型:医学影像中的调查】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 去噪扩散模型 去噪扩散模型是一类生成模型&#xff0c;最近在各种深度学习问题中引起了极大的兴趣。扩…

SICTF Round#3 の WP

Misc 签到 SICTF{1f4ce05a-0fed-42dc-9510-6e76dff8ff53} Crypto [签到]Vigenere 附件内容&#xff1a; Gn taj xirly gf Fxgjuakd, oe igywnd mt tegbs mnrxxlrivywd sngearbsw wakksre. Bs kpimj gf tank, it bx gur bslenmngn th jfdetagur mt ceei yze Ugnled Lystel t…

2024.2.21 C++QT 作业

思维导图 练习题 1>使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数&#xff0c;将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"…

docker 安装rabbitmq

1、搜索镜像 docker search rabbitmq 2、拉取镜像 docker pull rabbitmq 3、启动容器 #方式一&#xff1a;默认guest 用户&#xff0c;密码也是 guest docker run -d --hostname rabbitmq --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:management #方式二&…

项目开发日志(登录界面):2. LoginTitle组件

LoginTitle组件 样式 说明 属性 属性名含义类型是否必填默认值welcomeTitle欢迎标语String是无mainTitle标题String是无 样式 mainColor -> 主题颜色 代码 <template><div class"logintitle-container"><p class"subtitle">{{ welc…

Flume(二)【Flume 进阶使用】

前言 学数仓的时候发现 flume 落了一点&#xff0c;赶紧补齐。 1、Flume 事务 Source 在往 Channel 发送数据之前会开启一个 Put 事务&#xff1a; doPut&#xff1a;将批量数据写入临时缓冲区 putList&#xff08;当 source 中的数据达到 batchsize 或者 超过特定的时间就会…

QT的UI入门

二、UI入门 QWidget类&#xff08;熟悉&#xff09; QWidget类是所有组件和窗口的基类&#xff0c;内部包含了一些基础的界面特性。 常用属性&#xff1a; 修改坐标 x : const int 横坐标&#xff0c;每个图形的左上角为定位点&#xff0c;横轴的零点在屏幕的最左边&#xff0c…

宝塔面板-安装与卸载

宝塔面板&#xff08;BT Panel&#xff09;是一款在互联网上广泛使用的服务器管理软件&#xff0c;它以其简洁的界面和强大的功能受到了许多站长的喜爱。通过宝塔面板&#xff0c;用户可以轻松地管理服务器上的网站、数据库、FTP、邮箱等服务。本文将详细介绍宝塔面板的安装与卸…

笔记 记录

前言 个人记录 官网模版 基于 vue2 示例图

c#创建安装windows服务

背景:最近在做设备数据对接采集时,遇到一些设备不是标准的Service-Client接口,导致采集的数据不够准确;比如设备如果中途开关机后,加工的数量就会从0开始重新计数,因此需要实时监控设备的数据,进行叠加处理;考略到工厂设备比较多,实时监听接口的数据为每秒3次,因此将…

用html编写的招聘简历

用html编写的招聘简历 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

【web | CTF】BugKu CTF Simple_SSTI_1 和 2

天命&#xff1a;相信自己 一打开题目就告诉你输入flag参数&#xff0c;而且你输入什么就输出什么 输入&#xff1a;1 输出&#xff1a;1 很明显就是模板注入&#xff0c;Python的web框架独有的漏洞 那就简单&#xff0c;去查一下payload&#xff0c;一把梭 学习可以看这篇…

新书推荐:《分布式商业生态战略:未来数字商业新逻辑与企业数字化转型新策略》

近两年&#xff0c;商业经济环境的不确定性越来越明显&#xff0c;市场经济受到疫情、技术、政策等多方因素影响越来越难以预测&#xff0c;黑天鹅事件时有发生。在国内外经济方面&#xff0c;国际的地缘政治对商业经济产生着重大的影响&#xff0c;例如供应链中断&#xff0c;…

UE4 C++联网RPC教程笔记(一)(第1~4集)

UE4 C联网RPC教程笔记&#xff08;一&#xff09;&#xff08;第1~4集&#xff09; 前言1. 教程介绍与资源2. 自定义 Debug 功能3. Actor 的复制4. 联网状态判断 前言 本系列笔记将会对梁迪老师的《UE4C联网RPC框架开发吃鸡》教程进行个人的知识点梳理与总结&#xff0c;此课程…

【GPTs分享】每日GPTs分享之Canva

简介 Canva&#xff0c;旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片&#xff0c;Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成&#xff1a;根据用户的描述和创意需求&#xff0c;生成定制的设…

我为什么不喜欢关电脑?

程序员为什么不喜欢关电脑&#xff1f; 你是否注意到&#xff0c;程序员们似乎从不关电脑&#xff1f;别以为他们是电脑上瘾&#xff0c;实则是有他们自己的原因&#xff01;让我们一起揭秘背后的原因&#xff0c;看看程序员们真正的“英雄”本色&#xff01; 一、上大学时。 …

【蓝桥杯】算法模板题(Floyd算法)

一.弗洛伊德算法 用途&#xff1a;用来求解多源点最短路径问题。 思想&#xff1a;Floyd算法又称为插点法&#xff0c;是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。 主要步骤&#xff1a; 1&#xff09;初始化&#xff1a;使用邻接矩阵初始化dis…

书生开源大模型-第2讲-笔记

1.环境准备 1.1环境 先克隆我们的环境 bash /root/share/install_conda_env_internlm_base.sh internlm-demo1.2 模型参数 下载或者复制下来&#xff0c;开发机中已经有一份参数了 mkdir -p /root/model/Shanghai_AI_Laboratory cp -r /root/share/temp/model_repos/inter…

MPC自动驾驶横向控制算法实现 c++

参考博客&#xff1a; &#xff08;1&#xff09;无人车系统&#xff08;十一&#xff09;&#xff1a;轨迹跟踪模型预测控制(MPC)原理与python实现【40行代码】 &#xff08;2&#xff09;【自动驾驶】模型预测控制(MPC)实现轨迹跟踪 &#xff08;3&#xff09;自动驾驶——模…

【STM32 物联网】AT指令与TCP,发送与接收数据

文章目录 前言一、连接TCP服务器1.1 配置Wifi模式1.2 连接路由器1.3 查询ESP8266设备IP地址1.4 连接TCP服务器 二、向服务器接收数据和发送数据2.1 发送数据2.2 接收数据 总结 前言 随着物联网&#xff08;IoT&#xff09;技术的迅速发展&#xff0c;越来越多的设备和系统开始…
推荐文章