반응형
https://www.acmicpc.net/problem/1238
1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
[ 문제풀이 ]
총 두 번의 dijkstra로 정답을 쉽게 구할 수 있는 문제였습니다.
먼저 정방향으로 간선들을 모두 저장해주고 이를 이용해서 dijkstra를 돌리면 특정 정점에서 각 정점까지의 최단거리를 구할 수 있습니다.
하지만 왕복을 해야 하기 때문에 역방향 간선들을 이용하여 dijkstra를 한번 더 돌려줍니다. 그렇게 되면 각 정점에서 특정 정점까지 오는데 걸리는 최단 거리를 구할 수 있습니다.
그리고 각 정점까지 가는 데 이동한 거리를 더해주고 그중 가장 큰 값을 출력하면 되는 문제입니다.
[ 소스 코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include <iostream> #include <queue> #include <vector> using namespace std; struct Node { int to; int cost; }; struct cmp { bool operator()(Node right, Node left) { return left.cost < right.cost; } }; int N, M, X; vector<Node> list[1001]; //간선들을 정방향으로 저장할 vector list vector<Node> relist[1001]; //간선들을 역방향으로 저장할 vector relist int dist[1001]; void dijkstra(vector<Node> list[]) //한 점에서 출발하여 각 노드까지 거리를 dist 배열에 저장 { int visited[1001] = { 0 }; priority_queue<Node, vector<Node>, cmp> pq; pq.push({ X, 0 }); while (!pq.empty()) { int node = pq.top().to; int cost = pq.top().cost; pq.pop(); if (visited[node]) continue; visited[node]++; dist[node] += cost; for (int i = 0; i < list[node].size(); i++) { int next = list[node][i].to; int nextCost = list[node][i].cost; if (visited[next] != 1) { pq.push({ next, cost + nextCost }); } } } } int main() { cin >> N >> M >> X; for (int i = 0; i < M; i++) { int A, B, T; scanf("%d %d %d", &A, &B, &T); list[A].push_back({ B,T }); //간선을 정방향으로 저장 relist[B].push_back({ A,T }); //간선을 역방향으로 저장 } int ans = 0; dijkstra(list); //정방향 dijkstra dijkstra(relist); //역방향 dijkstra for (int i = 1; i <= N; i++) { if (ans < dist[i]) { ans = dist[i]; //거리의 최댓값을 ans에 저장 } } cout << ans; } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 11404번 - 플로이드 (C++) (0) | 2022.06.11 |
---|---|
[ 백준 ] 1865번 - 웜홀 (C++) (0) | 2022.06.10 |
[ 백준 ] 12865번 - 평범한 배낭 (C++) (0) | 2022.06.08 |
[ 백준 ] 9663번 - N-Queen (C++) (0) | 2022.06.07 |
[ 백준 ] 1504번 - 특정한 최단 경로 (C++) (0) | 2022.06.06 |