[BOJ/11280] 2-SAT - 3, c++

2021. 8. 19. 02:02ยทDEV/PS

๐Ÿ”— ๋งํฌ

https://www.acmicpc.net/problem/11280

 

11280๋ฒˆ: 2-SAT - 3

์ฒซ์งธ ์ค„์— ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜ N (1 ≤ N ≤ 10,000)๊ณผ ์ ˆ์˜ ๊ฐœ์ˆ˜ M (1 ≤ M ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ์ ˆ์ด ์ฃผ์–ด์ง„๋‹ค. ์ ˆ์€ ๋‘ ์ •์ˆ˜ i์™€ j (1 ≤ |i|, |j| ≤ N)๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, i์™€ j๊ฐ€

www.acmicpc.net

๐Ÿคฏ ํ•œ์ค„ ํ›„๊ธฐ

๊ทธ๋งŒ ๊ดด๋กญํ˜€์ฃผ๋ผ 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/

 

[๊ทธ๋ž˜ํ”„] 2-SAT๋ฌธ์ œ - 1

2-SAT๋ฌธ์ œ๋ž€? 2-SAT(2-SATisfiability)๋ฌธ์ œ๋Š” ์ถฉ์กฑ ๊ฐ€๋Šฅ์„ฑ ๋ฌธ์ œ(satisfiability problem)์˜ ํ•œ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. ์ถฉ์กฑ ๊ฐ€๋Šฅ์„ฑ ๋ฌธ์ œ๋ž€, ์—ฌ๋Ÿฌ ๊ฐœ์˜ boolean๋ณ€์ˆ˜๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ์‹์ด ์žˆ์„ ๋•Œ ๊ฐ ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜์—ฌ ์‹์„

justicehui.github.io

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'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
'DEV/PS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [BOJ/20666] ์ธ๋ฌผ์ด์™€ ์ •์ˆ˜, c++
  • [BOJ/20665] ๋…์„œ์‹ค ๊ฑฐ๋ฆฌ๋‘๊ธฐ, c++
  • [BOJ/17222] ์œ„์Šคํ‚ค ๊ฑฐ๋ž˜, c++
  • [BOJ/13904] ๊ณผ์ œ, c++
jobchae
jobchae
๋งํ•˜๋Š” ๊ฐ์ž์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ๋„์ ์ด๋Š” Node.js ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.
  • jobchae
    JOBCHAE
    jobchae
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿš€ JOBCHAE (182)
      • DEV (151)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • ์žก๋‹คํ•œ ๊ฐœ๋ฐœ ์ผ์ง€ (21)
        • injection (1)
        • JS, TS (3)
        • DB (2)
      • ์ถ•๊ตฌ (0)
      • ์ผ์ƒ (19)
      • ์˜ํ™” (3)
      • ์Œ์•… (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๐Ÿ’ป Github
    • ๐Ÿ™‹๐Ÿป Linkedin
    • ๐Ÿ“– ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • PS Github
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์Šฌ๋ž™๋ด‡
    ์ผ์ƒ
    db
    DP
    ๋ ›์ธ ๋ฝํŽ˜์Šคํ‹ฐ๋ฒŒ
    GitHub
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    react
    ์œ„์ƒ์ •๋ ฌ
    ์šฐ์„ ์ˆœ์œ„ํ
    typescript
    ์ด๋ถ„ํƒ์ƒ‰
    ํšŒ๊ณ 
    nodejs
    ์•ฑ์žผ
    ๋ฐฑ์ค€
    BFS
    DFS
    ์†ํŠธ
    SOPT
    PS
    Express
    ์Šฌ๋ž™
    JavaScript
    node.js
    ๋ฆฌ์•กํŠธ
    Nest.js
    mongoDB
    boj
    ๊ฐœ๋ฐœ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
jobchae
[BOJ/11280] 2-SAT - 3, c++
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”