ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 - 15591 [C++]
    문제 풀이/백준 2023. 7. 29. 15:15
    반응형

     이 문제는 bfs로 푸는 문제이다. 처음에 이 문제를 풀때 순간 플로이드 워셜이 떠올라서 그렇게 풀어봤는데 애초에 값이 제대로 안 나왔다. 그래서 bfs로 다시 방향을 고치고 풀었는데, 이번에는 시간 초과가 났다. 처음에 bfs를 짤때는 start와 end를 두어 모든 짝에 대한 USADO를 저장했는데, 이런 식으로는 5000 * 5000 * 5000의 연산이 필요하게 되어 시간 초과가 난다. 다시 생각해보니 그럴 필요가 전혀 없었고, 시작점에서 출발하여 정점들을 방문하면서 USADO를 측정하고, 그 값이 k보다 크거나 같으면 카운트하면 되는 문제였다.

     문제를 풀 때 알고리즘을 안 보고 푸는 연습을 꼭 해야할 것 같다. 실제 코딩 테스트 시에는 이 문제가 어떤 알고리즘의 문제인지 알려주지 않기 때문이다.

     

     

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <utility>
    #include <algorithm>
    
    using namespace std;
    
    vector<pair<int, int>> edges[5001];
    
    #define INF	1000000001
    
    vector<bool> visited;
    
    int bfs(int start, int N, int k)
    {
    	visited = vector<bool>(N + 1, false);
    
    	visited[start] = true;
    	queue<pair<int, int>> q;
    	q.push({ start, INF });
    
    	int answer = 0;
    
    	while (!q.empty())
    	{
    		pair<int, int> present = q.front();
    		q.pop();
    
    		for (int i = 0; i < edges[present.first].size(); i++)
    		{
    			pair<int, int> next = edges[present.first][i];
    
    			if (!visited[next.first])
    			{
    				if (min(present.second, next.second) >= k)
    				{
    					answer++;
    				}
    				q.push({ next.first, min(present.second, next.second) });
    				visited[next.first] = true;
    			}
    		}
    	}
    
    	return answer;
    }
    
    int main()
    {
    	ios_base::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    
    	int N, Q;
    
    	cin >> N >> Q;
    
    	for (int i = 0; i < N - 1; i++)
    	{
    		int p, q, r;
    
    		cin >> p >> q >> r;
    
    		edges[p].push_back({ q, r });
    		edges[q].push_back({ p, r });
    	}
    
    	for (int i = 0; i < Q; i++)
    	{
    		int k, v;
    
    		cin >> k >> v;
    
    		int cnt = bfs(v, N, k);
    		
    		cout << cnt << '\n';
    	}
    
    	return 0;
    }
    반응형

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

    백준 - 20058 [C++]  (0) 2023.08.05
    백준 - 17825 [C++]  (0) 2023.07.31
    백준 - 17837 [C++]  (0) 2023.07.20
    백준 - 20056 [C++]  (0) 2023.07.18
    백준 - 12851 [C++]  (0) 2023.07.18
Designed by Tistory.