본문 바로가기

백준/그래프

[USACO] 백준 15591 - MooTube (Silver)

728x90
728x90

www.acmicpc.net/problem/15591

 

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<intint>;
 
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, 0sizeof 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
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