https://www.acmicpc.net/problem/16367
클래스7 다 밀기 중
3개 중 2개 이상 참이어야 한다..? 한참 동안 아무 생각도 안 들었다
각 전등을 부울 리터럴으로 생각할 수 있고, 부울식에서 우리가 풀 수 있는 건 2-SAT밖에 없으니 어케어케 2-CNF 꼴로 바꿔야 한다
A, B, C 중 2개 이상이 참임은 (A or B) and (B or C) and (C or A)와 동치이며, 이 식은 2-CNF 형식이니 문제를 풀 수 있다
이제 플로우 n개 SA 2개 풀어야하는데,, 상당히귀찮은
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#include <bits/stdc++.h>
using namespace std;
vector<int> G[10101], rev[10101], stk;
int scc[10101];
void add(int a, int b){
a = a > 0 ? a*2 : -a*2+1;
b = b > 0 ? b*2 : -b*2+1;
G[a^1].push_back(b);
G[b^1].push_back(a);
rev[b].push_back(a^1);
rev[a].push_back(b^1);
}
void dfs(int v){
scc[v] = -1;
for (int i : G[v]){
if (!scc[i])
dfs(i);
}
stk.push_back(v);
}
void get(int v, int c){
scc[v] = c;
for (int i : rev[v]){
if (scc[i] == -1)
get(i, c);
}
}
int main() {
cin.tie(nullptr)->sync_with_stdio(0);
int k, n;
cin >> k >> n;
for (int i = 0; i < n; i++){
int a[3];
char c;
for (int j = 0; j < 3; j++) {
cin >> a[j] >> c;
if (c == 'R') a[j] = -a[j];
}
add(a[0], a[1]);
add(a[1], a[2]);
add(a[2], a[0]);
}
for (int i = 2; i <= k*2+1; i++){
if (!scc[i])
dfs(i);
}
reverse(stk.begin(), stk.end());
int ii = 0;
for (int i : stk){
if (scc[i] == -1)
get(i, ++ii);
}
string ans;
for (int i = 1; i <= k; i++){
if (scc[i*2] == scc[i*2+1]){
cout << -1;
return 0;
}
ans.push_back("RB"[scc[i*2] > scc[i*2+1]]);
}
cout << ans;
}
|
cs |
'문제풀이 > 백준' 카테고리의 다른 글
| 백준 3654 L퍼즐 (0) | 2025.11.30 |
|---|---|
| 백준 19651 수열과 쿼리 39 (0) | 2025.11.09 |
| 백준 13538 XOR 쿼리 (0) | 2025.10.26 |
| 백준 23592 Reactor (1) | 2025.10.18 |
| 백준 22316 Regions (0) | 2025.09.13 |