※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1948번 문제인 임계경로이다.
문제는 아래 링크를 확인하자.
1948번: 임계경로
첫째 줄에 도시의 개수 n(1 ≤ n ≤ 10,000)이 주어지고 둘째 줄에는 도로의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 도로의 정보가 주어진다. 처음에는 도로의
www.acmicpc.net
글쓴이는 이 문제를 위상정렬(topological sorting)으로 도착도시까지 찾아가면서 각 도시까지 걸리는 최대시간으로 가는 경로가 되는 도시들을 저장한 후, 도착도시에서 출발도시방향으로 역추적하며 간선의 수를 세어 풀었다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::vector;
using std::pair;
vector<pair<int,int>> G[10001]; // 출발도시에서 도착도시로 가는 가중치 있는 그래프
int inway[10001]; // i번 노드로 들어오는 경로수(indegree)
int dist[10001]; // i번 노드까지 오는 데에 걸리는 최대 시간
vector<int> cnt[10001]; // i번 노드로 들어오는 데에 최대 시간이 걸리는 경로인 이전노드들을 모은 그래프
int target; // 도착도시
bool visited[10001]; // backtrack에서 이미 확인한 도시 중복탐색 방지용
int running = 0; // 달려야하는 도로 수
void backtrack(int node) {
vector<int>::iterator iter = cnt[node].begin();
for (;iter != cnt[node].end();iter++) {
running++;
if (!visited[*iter]) {
visited[*iter] = 1;
backtrack(*iter);
}
}
}
void dfs(int root, int parent) {
if (root == target) {
backtrack(target);
cout << dist[target] << '\n' << running;
}
vector<pair<int, int>>::iterator iter = G[root].begin();
for (;iter != G[root].end();iter++) {
int current = (*iter).first, l = (*iter).second;
inway[current]--;
if (dist[current] < dist[root] + l) {
dist[current] = dist[root] + l;
cnt[current].clear();
cnt[current].push_back(root);
}
else if (dist[current] == dist[root] + l) {
cnt[current].push_back(root);
}
if (inway[current] == 0) dfs(current, root);
}
}
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
int n, m; cin >> n >> m;
for (int i = 0;i < m;i++) {
int s, e, t; cin >> s >> e >> t;
G[s].push_back({e,t});
inway[e]++;
}
int root;
cin >> root >> target;
dfs(root, 0);
return 0;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 16922 // C++] 로마 숫자 만들기 (0) | 2021.04.04 |
---|---|
[BOJ 16969 // C++] 차량 번호판 2 (0) | 2021.04.03 |
[BOJ 6549 // C++] 히스토그램에서 가장 큰 직사각형 (0) | 2021.04.01 |
[BOJ 1693 // C++] 트리 색칠하기 (0) | 2021.03.31 |
[BOJ 1135 // C++] 뉴스 전하기 (0) | 2021.03.30 |