반응형
https://www.acmicpc.net/problem/16118
16118번: 달빛 여우
첫 줄에 나무 그루터기의 개수와 오솔길의 개수를 의미하는 정수 N, M(2 ≤ N ≤ 4,000, 1 ≤ M ≤ 100,000)이 주어진다. 두 번째 줄부터 M개의 줄에 걸쳐 각 줄에 세 개의 정수 a, b, d(1 ≤ a, b ≤ N, a ≠ b
www.acmicpc.net
[ 문제풀이 ]
1. visited[ node ][ speed ] 배열을 만들어 속도별로 각 노드까지의 최단 거리를 저장합니다.
2. dijkstra를 통해 각 노드별로 최단거리를 구하고, 늑대가 빠르게 달릴 경우 거리 * 1, 여우의 경우 거리 * 2, 늑대가 느리게 달릴 경우 거리 * 4를 통해 속도를 조절합니다.
3. 여우의 도착시간보다 늑대의 도착 시간이 더 느릴 경우 ans++를 해줍니다.
4. ans를 출력합니다.
[ 소스코드 ]
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include<iostream> #include<queue> #include<vector> using namespace std; int N, M; vector<pair<int, int>> list[4001]; int visited[4001][3]; struct node { int to; int dist; int speed; }; struct cmp { bool operator()(node right, node left) { return left.dist < right.dist; } }; int main() { scanf("%d %d", &N, &M); for (int i = 2; i <= N; i++) { visited[i][0] = visited[i][1] = visited[i][2] = 2087654321; } visited[1][0] = 2087654321; for (int i = 0; i < M; i++) { int a, b, d; scanf("%d %d %d", &a, &b, &d); list[a].emplace_back(b, d); list[b].emplace_back(a, d); } priority_queue<node, vector<node>, cmp> pq; pq.push({ 1,0,1 }); pq.push({ 1,0,2 }); while (!pq.empty()) { const int dist = pq.top().dist; const int cur = pq.top().to; const int speed = pq.top().speed; pq.pop(); if (visited[cur][speed] < dist) continue; visited[cur][speed] = dist; if (speed == 0) { for (auto &next : list[cur]) { const int nNode = next.first; const int nDist = next.second * 4; if (visited[nNode][2] > dist + nDist) { visited[nNode][2] = dist + nDist; pq.push({ nNode,visited[nNode][2],2 }); } } } else if (speed == 1) { for (auto& next : list[cur]) { const int nNode = next.first; const int nDist = next.second * 2; if (visited[nNode][speed] > dist + nDist) { visited[nNode][speed] = dist + nDist; pq.push({ nNode,visited[nNode][speed],1 }); } } } else { for (auto& next : list[cur]) { const int nNode = next.first; const int nDist = next.second; if (visited[nNode][0] > dist + nDist) { visited[nNode][0] = dist + nDist; pq.push({ nNode,visited[nNode][0],0 }); } } } } int ans = 0; for (int i = 1; i <= N; i++) { if (visited[i][1] < visited[i][2] && visited[i][1] < visited[i][0]) { ans++; } } printf("%d", ans); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 2493번 - 탑 (C++) (0) | 2023.01.12 |
---|---|
[ 백준 ] 13975번 - 파일 합치기 3 (C++) (0) | 2023.01.11 |
[ 백준 ] 16562번 - 친구비 (C++) (0) | 2023.01.09 |
[ 백준 ] 14226번 - 이모티콘 (C++) (0) | 2023.01.08 |
[ 백준 ] 2470번 - 두 용액 (C++) (0) | 2023.01.07 |