문제풀이/백준oj
[백준oj] 1504번 특정한 최단 경로
Hyeon-Uk
2021. 1. 10. 18:53
반응형
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;
}
반응형