본문 바로가기
알고리즘 문제풀이/백준

[백준 15591] Moo Tube

by m2162003 2021. 2. 17.

www.acmicpc.net/problem/15591

 

15591번: MooTube (Silver)

농부 존은 1번 동영상과 2번 동영상이 USADO 3을 가지고, 2번 동영상과 3번 동영상이 USADO 2를 가지고, 2번 동영상과 4번 동영상이 USADO 4를 가진다고 했다. 이것에 기반해서 1번 동영상과 3번 동영상의

www.acmicpc.net

문제대로 풀면 TLE 발생

 

처음 접근 방법: 플로이드 와샬 알고리즘처럼 모든 경로에서의 최단 거리를 구하려했다. TLE 발생

 

-> 개선: BFS 사용. 모든 경로에서의 최단 거리를 구할 필요가 없다.

조건이 있는 BFS 문제였다. 

문제의 목적은 start노드에서 USADO가 K이상인 노드 수를 세는 게 목적이다.

i->a의 USADO는 min(i->j, j->a)이다.

i->j, j->a둘 중에 하나라도 K보다 작다면? a로 가는 USADO는 K보다 작을 것이다. 따라서 탈락

 

그래서 우리는 출발노드에서 거리가 K이상인 노드만 큐에 담고 그 수를 셀 것이다.

#include <iostream>
#include <vector>
#include <queue>
#include <string.h>

using namespace std;

bool visit[5001];
vector<pair<int, int>> v[5001];
int main(void)
{
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  int n, q;

  cin >> n >> q;

  for (int i = 0; i < n - 1; i++)
  {
    int from, to, val;
    cin >> from >> to >> val;
    v[from].push_back(make_pair(to, val));
    v[to].push_back(make_pair(from, val));
  }

  for (int i = 0; i < q; i++)
  {
    int k, start;
    cin >> k >> start;
    memset(visit, false, sizeof(visit));
    queue<int> q;
    int cnt = 0;

    q.push(start);
    visit[start] = true;

    while (!q.empty())
    {
      int front = q.front();
      q.pop();
      for (int i = 0; i < v[front].size(); i++)
      {
        int next = v[front][i].first;
        if (visit[next])
          continue;

        int val = v[front][i].second;
        if (val >= k)
        {
          cnt++;
          visit[next] = true;
          q.push(next);
        }
      }
    }
    cout << cnt << "\n";
  }

  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 11652] 카드  (0) 2021.02.25
[백준 148990] 경사로  (0) 2021.02.25
[백준 1339] 단어 수학  (0) 2021.02.09
[백준 11723] 집합  (0) 2021.02.06
[백준 10971] 외판원 순회2  (0) 2021.02.05

댓글