Link https://www.acmicpc.net/problem/1005
소스 결과 3440 KB / 304 ms
언어 C++ 17
출처 Baekjoon
분류 위상정렬, BFS
설명
최백준이 승리를 하여 여자친구 데이트를 할 수 있도록 도와주자
위상정렬에 관한 문제다. 위상 정렬을 하는 방법으로는 여러 방법이 있지만 Queue를 활용한 BFS와 유사한 방식으로 위상정렬을 진행한다.
알고리즘
1. 입력 받은 각 지점의 값을 기준으로 희소 인접 행렬을 구성한다.
2. 자신으로 들어오는 지점이 없는 점을 시작지점으로 판단하여 Queue에 push 한다.
3. Queue에 원소가 없을 때 까지 반복한다.
3-1. 현재 지점으로 들어가는 노드가 있는지 판별한다.
3-2. 현재 탐색하는 원소와 연결된 지점을 방문하고 시간을 계산한다.
3-3. 계산된 시간이 최대 시간이면 현재 지점의 최대 시간을 갱신한다.
4. 목표 지점의 최대 시간을 출력한다.
소스코드
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int tcc;
cin >> tcc;
while (tcc--) {
int n, k; cin >> n >> k;
vector<int> time(n);
vector<int> maxTime(n);
vector<int> degree(n);
vector<vector<int>> adj(n);
queue <int> q;
for (int i = 0; i < n; i++)
cin >> time[i];
for (int i = 0; i < k; i++) {
int to, des; cin >> to >> des;
adj[to - 1].push_back(des - 1);
degree[des - 1]++;
}
int tar; cin >> tar;
for (int i = 0; i < n; i++)
if (!degree[i]) {
q.push(i);
maxTime[i] = time[i];
}
while (!q.empty()) {
int cur = q.front(); q.pop();
if (degree[cur] < 1) {
for (int i = 0; i < adj[cur].size(); i++) {
int next = adj[cur][i];
int nextTime = maxTime[cur] + time[next];
if (maxTime[next] < nextTime) {
maxTime[next] = nextTime;
q.push(next);
}
degree[next]--;
}
}
}
cout << maxTime[tar - 1] << '\n';
}
return 0;
}
'Algorithm > BFS' 카테고리의 다른 글
Baekjoon 17290 Crazy_aRcade_Good (0) | 2019.08.21 |
---|---|
Baekjoon 6118 숨바꼭질 (0) | 2019.04.21 |
Baekjoon 1967 트리의 지름 (0) | 2019.04.21 |
Baekjoon 2206 벽 부수고 이동하기 (0) | 2019.04.21 |
Baekjoon 16236 아기상어 (0) | 2019.04.12 |