페이지

1504번: 특정한 최단 경로

https://www.acmicpc.net/problem/1504


$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;
}

댓글 없음 :

댓글 쓰기