【2-sat】2-sat算法內容及真題

A.2-sat簡介

2-sat算法可以求解給定推出關系下的一種合法情況。題目中重常常,給定一些布爾變量A、B、C、D…,再給出一系列形如 B ? A , C ? ? D B \longrightarrow A , C \longrightarrow \neg D B?A,C??D的推出關系,詢問使得所有推出關系都成立的一組布爾變量取值。

B.2-sat算法內容

1.無解情況

一個變量要么為真,要么為假,不能同時為真又為假。
如果 A ? ? A A \longrightarrow \neg A A??A,那該變量不能取值為真,因為,為真就觸發矛盾
如果 ? A ? A \neg A \longrightarrow A ?A?A,那該變量不能取值為假,因為,為假就觸發矛盾
所以,如果 A ? ? A A \longrightarrow \neg A A??A ? A ? A \neg A \longrightarrow A ?A?A,就找不到合法解。
其余情況有解。

2.構造合法解

嘗試貪心地構造一組合法解。
觀察這樣一組情況
A ? ? B ? C ? ? A ? D ? B A \longrightarrow \neg B\longrightarrow C\longrightarrow \neg A\longrightarrow D \longrightarrow B A??B?C??A?D?B
由于關系的傳遞性,

  • 如果A為真,后面5個變量都要合法,即 B為假,C為真,A為假,D為真,B為真。不難發現,A為真且為假,B為真且為假,矛盾。
  • 如果A為假,只需最后3個變量合法,即D為真,B為真。

得出結論,對于變量A,選擇拓撲序靠后一個,更優。具體一些,嚴格優于另一個。
推廣到一般,對于任意變量X,選擇拓撲序靠后的取值為答案中的值。

3.算法實現

  1. 首先,需要建圖。假設共有n個變量,點 1,2,3…n表示變量為真情況,點 1 + n,2 + n,…n+n表示變量為假的情況。對于第 i 個變量,點 i 表示該變量為真, 點 i + n表示該變量為假。往每個點中存入由該點能推出的點,例如,
  • 變量 n 為真 推出 變量 1 為真,則往點n中存入1;
  • 變量 n 為真 推出 變量 1 為假,則往點n中存入 1 + n;
  • 變量 n 為假 推出 變量 1 為假,則往點n + n中存入 1
  1. 判斷無解情況,對整個圖求強聯通分量,如果 i 與 i + n在一個強聯通分量內部,則存在上文所說的 “ A ? ? A A \longrightarrow \neg A A??A ? A ? A \neg A \longrightarrow A ?A?A”,則無解。
  2. 如果有解,對每個變量,輸出拓撲序靠后的一個,即強聯通分量編號小的一個(tarjan算法的性質)。
\\tarjan
const int N = 1e6 + 10;
int dfn[N],low[N],cnt;
stack<int> stk;
bool ins[N];
int id[N],scc_cnt,sz[N];
vector<int> g[N];
int n,m;void tarjan(int u)
{dfn[u] = low[u] = cnt ++;stk.push(u);ins[u] = 1;for(auto j : g[u]){if(!dfn[j]){tarjan(j);low[u] = min(low[u],low[j]);}else if(ins[j]){low[u] = min(low[u],dfn[j]);}}if(dfn[u] == low[u]){int y;++scc_cnt;do{y = stk.top();stk.pop();ins[y] = 0;id[y] = scc_cnt;sz[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 << "NO\n";return;}}
	\\存儲答案vector<int> ans;for(int i = 1; i <= n; i ++){if(id[i] < id[i + n])ans.push_back(i);}

例題 P4782 【模板】2-SAT

題目描述

n n n 個布爾變量 x 1 ~ x n x_1\sim x_n x1?xn?,另有 m m m 個需要滿足的條件,每個條件的形式都是 「 x i x_i xi?true / false x j x_j xj?true / 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 x1?xn? x i ∈ { 0 , 1 } x_i\in\{0,1\} xi?{0,1}),表示構造出的解。

輸入輸出樣例 #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)之類的坑,但按照最常規寫法的寫的標程沒有出錯,各個數據點卡什么的提示在標程里。

思路

  • A ∨ B ? ? A ? B , ? B ? A A\vee B \Longleftrightarrow \neg A\longrightarrow B,\neg B\longrightarrow A AB??A?B,?B?A

練習

【2018ICPC首爾區域賽】
【2023ICPC濟南區域賽】
【2023ICPC網絡預選賽(2)】

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903944.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【git】獲取特定分支和所有分支

1 特定分支 1.1 克隆指定分支&#xff08;默認只下載該分支&#xff09; git clone -b <分支名> --single-branch <倉庫URL> 示例&#xff08;克隆 某一個 分支&#xff09;&#xff1a; git clone -b xxxxxx --single-branch xxxxxxx -b &#xff1a;指定分支…

LWIP帶freeRTOS系統移植筆記

以正點原子學習視頻為基礎的文章 LWIP帶freeRTOS系統移植 準備資料/工程 1、lwIP例程1 lwIP裸機移植 工程 &#xff0c; 作為基礎工程 改名為LWIP_freeRTOS_yizhi工程 2、lwIP例程6 lwIP_FreeRTOS移植 工程 3、freeRTO源碼 打開https://www.freertos.org/網址下載…

組網技術知識點

1.port-isloate enable命令用于實現兩個接口之間的二層數據隔離&#xff0c;三層數據互通。 2.交換機最多支持4096個VLAN&#xff0c;編號為1-4094 3.display bfd session all&#xff1a;查看BFD會話狀態是否UP 4.RJ45通過雙絞線連接以太網&#xff1b; AUI端口&#xff1…

Linux系統:進程程序替換以及相關exec接口

本節重點 理解進程替換的相關概念與原理掌握相關程序替換接口程序替換與進程創建的區別程序替換的注意事項 一、概念與原理 進程程序替換是操作系統中實現多任務和資源復用的關鍵機制&#xff0c;允許進程在運行時動態加載并執行新程序。 1.1 定義 進程程序替換是指用新程…

從此,K8S入門0門檻!

前言 當你想要入門K8S的時候&#xff0c;往往會被各種概念搞的暈乎乎的&#xff0c;什么API Server&#xff0c;Scheduler&#xff0c;Controller manager&#xff0c;Etcd&#xff0c;Pod&#xff0c;Kubelet&#xff0c;kube-proxy&#xff0c;deployment…… 哪怕你使用了…

[Python開發] 如何用 VSCode 編寫和管理 Python 項目(從 PyCharm 轉向)

在 Python 開發領域,PyCharm 一直是廣受歡迎的 IDE,但其遠程開發功能(如遠程 SSH 調試)僅在付費版中提供。為了適應服務器部署需求,很多開發者開始將目光轉向更加輕量、靈活且免費擴展能力強的 VSCode。本篇文章將詳細介紹,從 PyCharm 轉向 VSCode 后,如何高效搭建和管理…

處方流轉平臺權限控制模塊設計(基于RBAC模型)

這是基于筆者的一些經驗設計并加以完善的方案&#xff0c;僅供參考。 處方流轉平臺權限控制模塊設計&#xff08;基于RBAC模型&#xff09; 1. 需求分析 處方流轉平臺需要嚴格的權限控制&#xff0c;確保&#xff1a; 患者隱私數據保護處方開具、審核、調配、發藥等流程的合…

基于BM1684X+RK3588的智能工業視覺邊緣計算盒子解決方案

智能工業視覺邊緣計算終端技術方案書? ?1. 產品概述? 1.1 產品定位 面向工業自動化場景的高性能AI視覺處理設備集成BM1684X&#xff08;8TOPS INT8&#xff09;AI加速芯片 RK3588&#xff08;6TOPS NPU&#xff09;異構計算支持工業級多相機接入、實時缺陷檢測、高精度定…

軟件工程中的 QFD

: 軟件工程中的 QFD 在軟件工程領域,隨著市場競爭的加劇和用戶需求的日益復雜,如何有效地將用戶需求轉化為軟件產品,成為軟件開發團隊面臨的重要挑戰。而質量功能部署(Quality Function Deployment,QFD)作為一種強大的工具,為這一問題提供了有效的解決方案。 一、QF…

Vue2基礎速成

一、準備工作 首先下載vue2的JavaScript庫&#xff0c;并且命名為vue.min.js 下載鏈接&#xff1a;https://cdn.jsdelivr.net/npm/vue2&#xff08;若鏈接失效可去vue官網尋找&#xff09; CTRLS即可下載保存 文件目錄結構 二、使用操作原生DOM與使用VUE操作DOM的便捷性比較…

日語學習-日語知識點小記-構建基礎-JLPT-N4階段(14):かもしれません (~た?~ない)ほうがいいです

日語學習-日語知識點小記-構建基礎-JLPT-N4階段&#xff08;1&#xff14;&#xff09;&#xff1a;かもしれません &&#xff08;&#xff5e;た?&#xff5e;ない&#xff09;ほうがいいです 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師…

傳統銀行服務和 區塊鏈支付無縫融合的一種解決方案

Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目標是重構全球銀行體系,并打造開放且無須許可的經營環境。”在 DeFi 的金融世界中,加密資產架構在區塊鏈上,通過各個協議實現資產之間的高效轉移和價值的實時流通,如 Metamask 錢包的自托管,Uniswap 的資產交易,…

基于深度學習的毒蘑菇檢測

文章目錄 任務介紹數據概覽數據處理數據讀取與拼接字符數據轉化標簽數據映射數據集劃分數據標準化 模型構建與訓練模型構建數據批處理模型訓練 文件提交結果附錄 任務介紹 本次任務為毒蘑菇的二元分類&#xff0c;任務本身并不復雜&#xff0c;適合初學者&#xff0c;主要亮點…

時間給了我們什么?

時間給了我們什么&#xff1f; ?春秋易逝&#xff0c;青春難留&#xff0c;轉瞬之間已過半百。 ?過往中&#xff0c;有得有失&#xff0c;這就是人生。 ?一日三餐四季&#xff0c;日起日落里&#xff0c;成就了昨天、今天和明天&#xff0c;在歷史長河中&#xff0c;皆是…

軟件工程國考

軟件工程-同等學力計算機綜合真題及答案 &#xff08;2004-2014、2017-2024&#xff09; 2004 年軟工 第三部分 軟件工程 &#xff08;共 30 分&#xff09; 一、單項選擇題&#xff08;每小題 1 分&#xff0c;共 5 分&#xff09; 軟件可用性是指&#xff08; &#xff09…

數據結構*棧

棧 什么是棧 這里的棧與我們之前常說的棧是不同的。之前我們說的棧是內存棧&#xff0c;它是JVM內存的一部分&#xff0c;用于存儲局部變量、方法調用信息等。每個線程都有自己獨立的棧空間&#xff0c;當線程啟動時&#xff0c;棧就會被創建&#xff1b;線程結束&#xff0c…

IntelliJ IDEA 保姆級使用教程

文章目錄 一、創建項目二、創建模塊三、創建包四、創建類五、編寫代碼六、運行代碼注意 七、IDEA 常見設置1、主題2、字體3、背景色 八、IDEA 常用快捷鍵九、IDEA 常見操作9.1、類操作9.1.1、刪除類文件9.1.2、修改類名稱注意 9.2、模塊操作9.2.1、修改模塊名快速查看 9.2.2、導…

HTTP 快速解析

一、HTTP請求結構 HTTP請求和響應報文由以下部分組成&#xff08;以請求報文為例&#xff09;&#xff1a; 請求報文結構&#xff1a; 請求行&#xff1a;包含HTTP方法&#xff08;如GET/POST&#xff09;、請求URL和協議版本&#xff08;如HTTP/1.1&#xff0c;HTTP/2.0&…

【AI學習】李宏毅新課《DeepSeek-R1 這類大語言模型是如何進行「深度思考」(Reasoning)的?》的部分紀要

針對推理模型&#xff0c;主要講了四種方法&#xff0c;兩種不需要訓練模型&#xff0c;兩種需要。 對于reason和inference&#xff0c;這兩個詞有不同的含義&#xff01; 推理時計算不是新鮮事&#xff0c;AlphaGo就是如此。 這張圖片說明了將訓練和推理時計算綜合考慮的關系&…

Kotlin Flow流

一 Kotlin Flow 中的 stateIn 和 shareIn 一、簡單比喻理解 想象一個水龍頭&#xff08;數據源&#xff09;和幾個水杯&#xff08;數據接收者&#xff09;&#xff1a; 普通 Flow&#xff08;冷流&#xff09;&#xff1a;每個水杯來接水時&#xff0c;都要重新打開水龍頭從…