๐ ๋งํฌ
https://www.acmicpc.net/problem/11280
๐คฏ ํ์ค ํ๊ธฐ
๊ทธ๋ง ๊ดด๋กญํ์ฃผ๋ผ 2-SAT ์ด๋ ์
๐คท ๋ฌธ์
๐ฉ๐ป ํ์ด
2-SAT ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ ๋ฌธ์
SCC ๋ฅผ ๊ตฌํ ๋๋ ์ฝ์ฌ๋ผ์ฃผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์๋ค.
๋จผ์ k-SAT ์ด๋ Satisfiability Problem ์ผ๋ก ์ถฉ์กฑ ๊ฐ๋ฅ์ฑ ๋ฌธ์ ์ ํ ์ข ๋ฅ์ด๋ค. ์ด๋ k๊ฐ์ ๋ณ์์ OR ๋ ผ๋ฆฌ์์ผ๋ก ์ด๋ค์ง ์์์ ํด๋น ์์ด true ์ธ์ง false ์ธ์ง๋ฅผ ์ฐพ์๋ด๊ณ , true ์ผ๋ ์ด๋ฅผ ๋ง์กฑ์ํค๋ ๊ฐ ๋ณ์์ ๊ฐ๋ค์ ์์๋ด๋ ๋ฌธ์ ์ด๋ค.
์ด ์ค ๋์ฒด๋ก 2-SAT ๋ฌธ์ ๊ฐ ์์ฃผ ๋ณด์ผํ ๋ฐ ๊ทธ ์ด์ ๋ 1-SAT์ ๋๋ฌด ์ฝ๊ณ (ex. A^!B^C) 3-SAT ๋ถํฐ๋ ์์ง๊น์ง ๋คํญ์๊ฐ ๋ด์ ํ ์ ์๋์ง ์ ์ ์๋ P = NP ๋ฌธ์ ๊ธฐ ๋๋ฌธ์ด๋ค.
2-SAT์ ์ ํ์๊ฐ ์์ ํด๊ฒฐ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ํ๋ฅผ ๋ง๋ค์ด์ ํ์ด์ค ๊ฒ์ด๋ค.
๊ฐ ๋ณ์๋ณ๋ก 2๊ฐ์ ์ ์ ์ ๋ง๋ค์ด์ฃผ๋๋ฐ A, !A ์ด๋ ๊ฒ ์ ์ , not์ ๋ถ์ธ ์ ์ 2๊ฐ๋ก ๋ง๋ค์ด์ค๋ค.
์ ์ด์ , (A v B) ๋ฅผ ๋ณด๋ฉด ์ด ๋ ผ๋ฆฌ์์ด ์ฐธ์ด ๋๊ธฐ ์ํด์๋ A ๊ฐ false ์ผ ๊ฒฝ์ฐ B ๊ฐ true ์ฌ์ผ ํ๊ณ , ๋ฐ๋๋ก B๊ฐ false์ผ ๊ฒฝ์ฐ A๊ฐ true์ฌ์ผ ํ๋ค.
์ฆ, ๊ทธ๋ํ๋ก ๋ง๋ค ๋, !A -> B, !B -> A ๊ฐ์ ์ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๊ทธ๋ํ๋ฅผ ๋ง๋ค๊ณ ๋์ ์ ์ฒด ๋ ผ๋ฆฌ์์ด ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง ์์๋ด๋ ๋ฐฉ๋ฒ์ SCC ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ์๋ ค์ ธ์๋ค.
A ์ !A ๊ฐ ๊ฐ์ SCC ์์ ์ํ์ง ์๋๋ค๋ฉด ์ฐธ. A, !A๊ฐ ๊ฐ์ SCC ๋ผ๋ ๋ง์ ์ฆ, A -> !A, !A -> A์ ๊ฐ์ ์๋ฏธ! ์ด๋ A์ !A๊ฐ ๋ชจ๋ ์ฐธ์ด๋ ๋ง์ด๋๊น ๋ถ๊ฐ๋ฅํ ๋ง์ด๋ค.
๋ฐ๋ผ์ ์ฝ๋๋ก ๊ตฌํํ ๋, ๊ทธ๋ํ๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ , ์ฝ์ฌ๋ผ์ฃผ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ SCC ๋ฅผ ๊ตฌํ ํ, ๋น๊ตํด๋ณด๋ฉด ๋๋ค.
!A๋ ์ฌ๊ธฐ์ ์์๋ก ์ฃผ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ๋ฃ์ ์ ์๊ฒ๋ ์กฐ์ ์ด ํ์ํ๋ค.
๐ป ์ฝ๋
//AC
//BOJ 11280 2-SAT 3
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stack>
using namespace std;
vector<vector<int>> graph;
vector<vector<int>> re_graph;
vector<int> scc;
stack<int> s;
bool visit[20005];
void dfs(int x) {
visit[x] = true;
for(int next : graph[x]) {
if(!visit[next]) {
dfs(next);
}
}
s.push(x);
}
void re_dfs(int x, int y){
visit[x] = true;
scc[x] = y;
for(int next : re_graph[x]) {
if(!visit[next]) {
re_dfs(next, y);
}
}
}
int re(int x, int N) {
return x > N ? x - N : x + N;
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int N, M;
cin >> N >> M;
graph.resize(2*N+5);
re_graph.resize(2*N+5);
scc.resize(2*N + 5);
for(int i=0; i<M; i++) {
int u, v;
cin >> u >> v;
if(u < 0) u = -u + N;
if(v < 0) v = -v + N;
graph[re(u, N)].push_back(v);
graph[re(v, N)].push_back(u);
re_graph[u].push_back(re(v, N));
re_graph[v].push_back(re(u, N));
}
for(int i=1; i<=2*N+1; i++) {
if(!visit[i]) dfs(i);
}
memset(visit, false, sizeof(visit));
int idx = 1;
while(!s.empty()) {
int x = s.top();
s.pop();
if(!visit[x]) {
re_dfs(x, idx++);
}
}
for(int i=1; i<=N; i++) {
if(scc[i] == scc[i+N]) {
cout << 0 << '\n';
return 0;
}
}
cout << 1 << '\n';
return 0;
}
์ฐธ๊ณ
1. ICPC Sinchon ์๊ณ ๋ฆฌ์ฆ ์บ ํ - ์ค๊ธ ์คํฐ๋ '2-SAT' ๊ฐ์
2.
https://justicehui.github.io/hard-algorithm/2019/05/17/2SAT/
'DEV > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/20666] ์ธ๋ฌผ์ด์ ์ ์, c++ (2) | 2021.08.20 |
---|---|
[BOJ/20665] ๋ ์์ค ๊ฑฐ๋ฆฌ๋๊ธฐ, c++ (2) | 2021.08.20 |
[BOJ/17222] ์์คํค ๊ฑฐ๋, c++ (2) | 2021.08.12 |
[BOJ/13904] ๊ณผ์ , c++ (0) | 2021.08.10 |
[BOJ/22352] ํญ์ฒด์ธ์, c++ (0) | 2021.08.05 |