728x90
N, Q <= 5000 이므로
$O(NQ)$ 의 시간복잡도를 가진 솔루션으로 통과시킬 수 있고, 가장 간단한 구현은 각 쿼리마다 BFS를 돌려주는 것이다.
쿼리마다 BFS를 수행하면서 몇개의 동영상이 조건을 만족하는지 찾아주면 된다.
전체 코드
더보기
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
|
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
bool visit[5001];
int query(vector<vector<pii>> &adj, int start, int relevance);
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
int n, q;
cin >> n >> q;
vector<vector<pii>> al(n + 1);
for (int i = 0; i < n - 1; ++i)
{
int go, to, val;
cin >> go >> to >> val;
al[go].push_back({to, val});
al[to].push_back({go, val});
}
while (q--)
{
int k, from;
cin >> k >> from;
cout << query(al, from, k) << '\n';
}
}
int query(vector<vector<pii>> &adj, int start, int relevance)
{
int ret = 0;
memset(visit, 0, sizeof visit);
queue<pii> q;
q.push({start, 1e9 + 20});
while (q.size())
{
auto cur = q.front();
visit[cur.first] = true;
q.pop();
if (cur.second < relevance)
continue;
for (auto t : adj[cur.first])
{
if (visit[t.first])
continue;
int rele = min(cur.second, t.second);
if (rele >= relevance)
++ret;
q.push({t.first, rele});
}
}
return ret;
}
|
cs |
728x90
'백준 > 그래프' 카테고리의 다른 글
백준 7562 - 나이트의 이동 (0) | 2021.04.04 |
---|---|
백준 20530 - 양분 (0) | 2021.01.01 |
백준 1738 - 골목길 (0) | 2020.10.01 |
백준 11779 - 최소비용 구하기 2 (0) | 2020.08.13 |
[ICPC] 백준 5719 - 거의 최단 경로 (0) | 2020.08.13 |