홍시홍의 프로그래밍

[백준 1504] 특정한 최단 경로 본문

알고리즘 문제풀이/백준

[백준 1504] 특정한 최단 경로

홍시홍 2020. 1. 14. 00:27

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

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존재하며, 그 거리가 c라는 뜻이다. (1 ≤ c ≤ 1,000) 다음 줄에는 반드시 거쳐야 하는 두 개의 서로 다른 정점 번호가 주어진다.

www.acmicpc.net

 

요구사항

1에서 n으로 도달하는데 v1,v2를 거쳐서 도달하는 최소 이동 경로 구하기

 

풀이

1 -> v1 -> v2 ->n

1 -> v2 -> v1 ->n

의 두가지의 최소경로가 있다

1-> v1 최소경로

v1 ->v2 최소경로

v2, v1->n 최소경로를 각 각 구하여 최소 값을 출력한다.

 

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;
struct go {
	int x;
	int y;
};
int n, m;
const int INF = 0x7fffffff;
vector<go> v[801];
int startnode;
int endnode;
int Sdist[801];
int N1dist[801];
int N2dist[801];

void dik(int arr[],int start) {
	for (int i = 1; i <= n; i++) {
		arr[i] = INF;
	}
	arr[start] = 0;
	priority_queue<pair<int,int>> q;
	q.push({ 0,start });
	while (!q.empty()) {
		int Nowdist = -q.top().first;
		int Nowpos = q.top().second;
		q.pop();

		for (int i = 0; i < v[Nowpos].size(); i++) {
			int next = v[Nowpos][i].x;
			int nextdist = Nowdist+v[Nowpos][i].y;

			if (nextdist < arr[next]) {
				arr[next] = nextdist;
				q.push({ -nextdist,next });
			}
		}
	}
}
int main()
{
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int x, y,z;
		scanf("%d%d%d", &x, &y, &z);
		v[x].push_back({ y,z });
		v[y].push_back({ x,z });
		int zx;
		int asdf;
	}
	cin >> startnode >> endnode;
	dik(Sdist, 1);
	dik(N1dist, startnode);
	dik(N2dist, endnode);
	int ans1 = Sdist[startnode] + N1dist[endnode] + N2dist[n];
	int ans2 = Sdist[endnode] + N2dist[startnode] + N1dist[n];
	if (Sdist[startnode] == INF || Sdist[endnode] == INF || Sdist[n] == INF ||
		N1dist[1] == INF || N1dist[endnode] == INF || N1dist[n] == INF ||
		N2dist[1] == INF || N2dist[startnode] == INF || N2dist[n] == INF)
	{
		//cout << Sdist[startnode] << " " << Sdist[endnode] << " " << Sdist[n] << endl;
		//cout << N1dist[1] << " " << N1dist[endnode] << " " << N1dist[n] << endl;
		//cout << N2dist[1] << " " << N2dist[startnode] << " " << N2dist[n] << endl;

		cout << "-1" << endl;
	}
	else {
		ans1 = min(ans1, ans2);
		cout << ans1 << endl;
	}

	
	


}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 3047]ABC  (0) 2020.01.14
[백준 11657] 타임 머신  (0) 2020.01.14
[백준 4485] 젤다  (0) 2020.01.14
[백준 1261] 알고스팟  (0) 2020.01.14
[백준 1238] 파티  (0) 2020.01.14
Comments