-
Notifications
You must be signed in to change notification settings - Fork 0
/
28_GALLERY.cpp
64 lines (58 loc) · 1.49 KB
/
28_GALLERY.cpp
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
#include <cstdio>
#include <vector>
using namespace std;
// 코드 28.11 감시 카메라 문제를 해결하는 알고리즘의 구현
const int MAX_V = 1000;
int V;
vector<int> adj[MAX_V];
vector<bool> visited;
const int UNWATCHED = 0;
const int WATCHED = 1;
const int INSTALLED = 2;
// 지금까지 설치한 카메라의 총 수
int installed;
// here로부터 기이 우선 탐색을 하고, here의 정보를 반환한다
int dfs(int here) {
visited[here] = true;
int children[3] = { 0, 0, 0 };
for (int i = 0; i < adj[here].size(); ++i) {
int there = adj[here][i];
if (!visited[there])
++children[dfs(there)];
}
// 자손 노드 중 감시되지 않는 노드가 있을 경우 카메라를 설치한다
if (children[UNWATCHED]) {
++installed;
return INSTALLED;
}
// 자손 노드 중 카메라가 설치된 노드가 있을 경우 설치할 필요가 없다
if (children[INSTALLED])
return WATCHED;
return UNWATCHED;
}
// 그래프를 감시하는 데 필요한 카메라의 최소 수를 반환한다
int installCamera() {
installed = 0;
visited = vector<bool>(V, false);
for (int u = 0; u < V; ++u)
if (!visited[u] && dfs(u) == UNWATCHED)
++installed;
return installed;
}
int main(void) {
int C, G, H, u, v;
scanf("%d", &C);
while (C--) {
scanf("%d %d", &G, &H);
V = G;
for (int i = 0; i < H; i++) {
scanf("%d %d", &u, &v);
adj[u].push_back(v);
adj[v].push_back(u);
}
printf("%d\n", installCamera());
for (int i = 0; i < V; i++) {
adj[i].clear();
}
}
}