-
임계경로 - 1948Algorithm/BOJ 2020. 3. 4. 18:48123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102//1948 - 임계경로#include <iostream>#include <vector>#include <algorithm>using namespace std;int N, M;int s, e;vector<vector<pair<int, int>>> adj;vector<int> order;vector<int> change;vector<bool> seen;vector<bool> visit;int cache[10000];void init(){cin >> N >> M;for(int i = 0; i<N; ++i)cache[i] = -1;adj = vector<vector<pair<int, int>>>(N+1);order = vector<int>();change = vector<int>(N+1);visit = vector<bool>(N, false);seen = vector<bool>(N+1, false);int x, y, r;for(int i = 0; i<M; ++i){cin >> x >> y >> r;adj[x].push_back(make_pair(y, r));}cin >> s >> e;}void dfs(int here){seen[here] = true;for(int i = 0; i<adj[here].size(); ++i){int there = adj[here][i].first;if(!seen[there])dfs(there);}order.push_back(here);}void topologicalSort(){dfs(s);reverse(order.begin(), order.end());for(int i = 0; i<N; ++i)change[order[i]] = i;}int dp(int idx){if(idx == N-1)return 0;int& ret = cache[idx];if(ret != -1)return ret;int nidx = order[idx];for(int i = 0; i<adj[nidx].size(); ++i){int there = adj[nidx][i].first;int cost = adj[nidx][i].second;ret = max(ret, dp(change[there]) + cost);}return ret;}int trace(int idx){if(idx == N-1)return 0;visit[idx] = true;int ret = 0;int nidx = order[idx];for(int i = 0; i<adj[nidx].size(); ++i){int there = adj[nidx][i].first;int c = adj[nidx][i].second;if(dp(change[there]) + c == dp(idx)){++ret;if(!visit[change[there]])ret += trace(change[there]);}}return ret;}int main(){ios_base::sync_with_stdio(0);cin.tie(0);init();topologicalSort();cout << dp(0) << "\n";cout << trace(0);}
cs https://www.acmicpc.net/problem/1948
1948번: 임계경로
첫째 줄에 도시의 개수 n(1 ≤ n ≤ 10,000)이 주어지고 둘째 줄에는 도로의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 도로의 정보가 주어진다. 처음에는 도로의 출발 도시의 번호가 주어지고 그 다음에는 도착 도시의 번호, 그리고 마지막에는 이 도로를 지나는데 걸리는 시간이 주어진다. 도로를 지나가는 시간은 10,000보다 작거나 같은 자연수이다. 그리고 m+3째 줄에는 지도를 그리는 사람들이
www.acmicpc.net
임계경로
DAG 그래프에서 시작점에서 끝점까지 가는 경로중 최장거리와, 최장거리 경로에 포함되는 도로의 수를 출력하는 문제입니다.
위상정렬로 정점들을 줄세워 놓은 후, dp를 사용해 최장거리를 구하고, cache배열을 다시 참조해 방문한 도로들을 구했습니다.
'Algorithm > BOJ' 카테고리의 다른 글
구간 합 구하기 4 - 11659 (0) 2020.03.04 구간 합 구하기 5 - 11660 (0) 2020.03.04 줄 세우기 - 2252 (0) 2020.03.04 플로이드 - 11404 (0) 2020.03.03 섬의 개수 - 4963 (0) 2020.03.03