-
반응형
1504번: 특정한 최단 경로
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존
www.acmicpc.net
풀이)
이문제도 일단 모든 정점에서부터 다른 모든정점까지의 최단거리를 구해주는Floyd-warshall 알고리즘을 적용시킨뒤,
1->v1->v2->N 과 1->v2->v1->N중 더 작은 수를 출력해주면 된다.
코드)
#include<iostream> #include<algorithm> #define MAX 987654321 using namespace std; int n, m; int v1, v2; int arr[1001][1001]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j) arr[i][j] = 0; else arr[i][j] = MAX; } } for (int i = 0; i < m; i++) { int st, en, v; cin >> st >> en >> v; arr[st][en] = v; arr[en][st] = v; } for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { //i->j로가는거리와 i->k->j로 가는 경로중 작은값을 초기화 if (arr[i][j] > arr[i][k] + arr[k][j]) { arr[i][j] = arr[i][k] + arr[k][j]; } } } } cin >> v1 >> v2; //가는 길목중 하나라도 초기값MAX(업데이트가 안됨==가지못하는길)이면 -1출력 if (arr[1][v1] == MAX || arr[v1][v2] == MAX || arr[v2][n] == MAX) { cout << -1; return 0; } else if (arr[1][v2] == MAX || arr[v2][v1] == MAX || arr[v1][n] == MAX) { cout << -1; return 0; } //1->v1->v2->n 과 1->v2->v1->n중 더 작은값 출력 if (arr[1][v1] + arr[v1][v2] + arr[v2][n] > arr[1][v2] + arr[v2][v1] + arr[v1][n]) { cout << arr[1][v2] + arr[v2][v1] + arr[v1][n]; } else if (arr[1][v1] + arr[v1][v2] + arr[v2][n] < arr[1][v2] + arr[v2][v1] + arr[v1][n]) { cout << arr[1][v1] + arr[v1][v2] + arr[v2][n]; } return 0; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준oj] 1600번 말이 되고픈 원숭이 (0) 2021.03.03 [백준oj] 4485번 녹색 옷 입은 애가 젤다지? (0) 2021.01.10 [백준oj] 1238번 파티 (0) 2021.01.10 [백준oj] 1946번 신입 사원 (0) 2020.12.31 [백준oj] 6549번 히스토그램에서 가장 큰 직사각형 (0) 2020.12.29 댓글