$O(n^3)$
n범위가 작으므로 플로이드 알고리즘으로 최단 거리를 구해보자.
경로가 존재한다면 1-p-q-n, 1-q-p-n 중 최단 경로 비용을 출력한다.
#include<stdio.h> #include<algorithm> using namespace std; const int MAX_N = 8e2; int w[MAX_N + 1][MAX_N + 1], n, e, p, q, res; int main() { scanf("%d %d", &n, &e); fill(&w[0][0], &w[MAX_N][MAX_N + 1], 1e8); for (int i = 0, x, y, z; i < e; i++) { scanf("%d %d %d", &x, &y, &z); w[x][y] = w[y][x] = z; } for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) if (w[j][i] + w[i][k] < w[j][k]) w[j][k] = w[j][i] + w[i][k]; scanf("%d %d", &p, &q); w[p][p] = w[q][q] = 0; res = min(w[1][p] + w[p][q] + w[q][n], w[1][q] + w[q][p] + w[p][n]); printf("%d", res >= 1e8 ? -1 : res); return 0; }
댓글 없음 :
댓글 쓰기