IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2-SAT 问题【模板】 -> 正文阅读

[数据结构与算法]2-SAT 问题【模板】

>Link

lugou P4782


>Description

在这里插入图片描述


>解题思路

2-SAT问题如题目所示。
注意到每个变量只能为真或假,也就是同一个变量真和假不能同时存在。
我们可以根据题目要求满足的条件建图,把每个变量分成真假两个点,按照条件建边,比如 「 x 1 x_1 x1?为真或 x 3 x_3 x3?为假」,就建一条边 ( x 1 r e a l , x 3 r e a l ) (x_1real,x_3real) (x1?real,x3?real),表示起点可以推出终点。
无解的情况就是同一个变量的真假互相推出了(注意是互相),可以用tarjan判强连通分量判断


>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#define N 2000010
using namespace std;

stack<int> st;
struct edge
{
	int to, nxt;
} e[N], ee[N];
int n, m, low[N], dfn[N], tot, col[N], totcol, cnt, h[N];

void add (int u, int v)
{
	e[++cnt] = (edge){v, h[u]};
	h[u] = cnt;
}
void dfs (int now)
{
	dfn[now] = low[now] = ++tot;
	st.push (now);
	int v;
	for (int i = h[now]; i; i = e[i].nxt)
	{
		v = e[i].to;
		if (!dfn[v])
	  	{
	  		dfs (v);
	  		low[now] = min (low[now], low[v]);
	  	}
	  	else if (!col[v]) low[now] = min (low[now], low[v]);
	}
	if (dfn[now] == low[now])
	{
		col[now] = ++totcol;
		while (st.top() != now)
		{
			col[st.top()] = totcol;
			st.pop();
		}
		st.pop();
	}
}

int main()
{
	scanf ("%d%d", &n, &m);
	while (m--)
	{
		
		int a, b, i, j;
		scanf ("%d%d%d%d", &i, &a, &j, &b);
		add (i + a * n, j + (b ^ 1) * n);
		add (j + b * n, i + (a ^ 1) * n);
	}
	for (int i = 1; i <= n * 2; i++)
	  if (!dfn[i]) dfs (i);
	for (int i = 1; i <= n; i++)
	  if (col[i] == col[i + n])
	  {
	  	printf ("IMPOSSIBLE");
	  	return 0;
	  }
	printf ("POSSIBLE\n");
	for (int i = 1; i <= n; i++)
	  printf ("%d ", col[i] < col[i + n]);
	puts ("");
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 12:00:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:30:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码