문제: icpc.me/13213
N개의 정점과 E개의 간선으로 이루어진 그래프에서 0번정점에서 N-1번 정점으로의 최단거리를 구하는 문제이다.
단, 조건이 하나있는데 엣지에 패리티가 붙어있어서 0이나 1중 하나의 속성을 지닌다. 이전에 0인 엣지를 통하여 왔다면 다음에는 1인 엣지만 밟을 수 있다.
이 문제를 해결하기 위하여 각 정점을 2차원으로 생각해주면 된다. 0인 엣지를 밟고 V번 정점인 경우와 1인 엣지를 밟고 V번 정점인 경우로 나눠서 생각해주면 다익스트라를 2번 실행하는 것으로 문제를 해결해 줄 수 있다. N제한이 크긴 하지만 시간이 3초이니 제한시간 내에는 넉넉히 들어올 수 있다.
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 | #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cstring> using namespace std; int n, e, dp[200020][2], res; vector<vector<pair<int, int>>> vt; int main() { scanf("%d%d", &n, &e); vt.resize(n + 1); for (int i = 0; i < e; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); x++, y++; vt[x].push_back({ y,z }); vt[y].push_back({ x,z }); } res = 1e9; priority_queue<pair<int, pair<int,int>>> pq; pq.push({ 0,{1,0} }); memset(dp, -1, sizeof(dp)); while (pq.size()) { int here = pq.top().second.first; int pt = pq.top().second.second; int cost = -pq.top().first; pq.pop(); if (dp[here][pt] != -1)continue; dp[here][pt] = cost; for (auto &next : vt[here]) { if (dp[next.first][pt ^ 1] != -1)continue; if (next.second != 1-pt)continue; pq.push({ -cost - 1,{next.first,next.second} }); } } if (dp[n][0] != -1)res = min(res, dp[n][0]); if (dp[n][1] != -1)res = min(res, dp[n][1]); pq.push({ 0,{ 1,1 } }); memset(dp, -1, sizeof(dp)); while (pq.size()) { int here = pq.top().second.first; int pt = pq.top().second.second; int cost = -pq.top().first; pq.pop(); if (dp[here][pt] != -1)continue; dp[here][pt] = cost; for (auto &next : vt[here]) { if (dp[next.first][pt ^ 1] != -1)continue; if (next.second != 1-pt)continue; pq.push({ -cost - 1,{ next.first,next.second } }); } } if (dp[n][0] != -1)res = min(res, dp[n][0]); if (dp[n][1] != -1)res = min(res, dp[n][1]); if (res == 1e9)res = -1; printf("%d\n", res); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)2023 신기한 소수 (0) | 2017.10.16 |
---|---|
BOJ)13212 Random (1) | 2017.10.16 |
BOJ)11442 홀수번째 피보나치 수의 합 (0) | 2017.10.14 |
BOJ)11443 짝수번째 피보나치 수의 합 (0) | 2017.10.14 |
BOJ)5883 아이폰 9S (0) | 2017.10.13 |