순간을 성실히, 화려함보단 꾸준함을

[ boj : 1504 ] 특정한 최단 경로 본문

알고리즘,SQL/백준,BOJ

[ boj : 1504 ] 특정한 최단 경로

폭발토끼 2021. 2. 23. 22:55

www.acmicpc.net/problem/1504

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

문제 : 그래프와 간선이 주어지고 꼭 거쳐야 할 두 정점이 주어질때 1->N 까지의 최단거리를 구해라

 

해설 : n=800이니 그냥 플로이드-와샬 알고리즘을 사용해서 구해줬습니다.

꼭 거쳐야 할 정점이 a,b 라면

min(1->a->b->N,1->b->a->N) 이 답이 되겠죠. 도달할 수 없는 부분을 따로 예외처리 해주시고요.

 

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

int n, m;
ll adj[801][801], dist[801][801];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	ll a, b, c;
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		cin >> a >> b >> c;
		adj[a][b] = adj[b][a] = c;
	}
	cin >> a >> b;
	for(int i=1;i<=n;i++)
		for (int j = 1; j <= n; j++)
		{
			if (i == j)adj[i][j] = 0;
			else if (adj[i][j])dist[i][j] = adj[i][j];
			else dist[i][j] = (int)1e9;
		}
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
	
	ll x = min(dist[1][a] + dist[a][b] + dist[b][n], dist[1][b] + dist[b][a] + dist[a][n]);
	if (x >= (ll)1e9)cout << -1;
	else cout << x;
	return 0;
}