알고리즘/boj

BOJ 1238 파티

칼퇴시켜주세요 2023. 1. 31. 18:20
728x90

이 문제는 기본적으로 A - B까지 갈수 있는 경로 중 최단 시간을 구하는 다익스트라 응용 문제이다.

기존에 자주 출제되는 다익스트라는 무방향 그래프로  A - B 까지의 최단 경로와  B - A 까지의 최단 경로는 같다. 하지만 이 문제는 방향 그래프로 A - B 까지의 최단 경로와 B - A 까지의 최단 경로가 다르다. 따라서 문제에서 학생들이 오고 가는데 가장 오래 걸리는 학생의 소요시간을 구하기 위해서는 다익스트라를 두번 돌려주어야 한다.

#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#define INF 987654321
using namespace std;

int n, m, x;
vector<pair<int,int>> adj[1001];

int dajik(int start, int end)
{
	vector<int> dist(n + 1, INF);
	priority_queue<pair<int, int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;

	dist[start] = 0;
	pq.push({ 0,start });

	while(!pq.empty())
	{
		int cur_dist = pq.top().first;
		int cur_node = pq.top().second;
		pq.pop();

		for(int i = 0; i < adj[cur_node].size(); i++)
		{
			int next_node = adj[cur_node][i].first;
			int next_dist = adj[cur_node][i].second;
			if(dist[next_node] > (cur_dist + next_dist))
			{
				dist[next_node] = cur_dist + next_dist;
				pq.push({ cur_dist + next_dist, next_node });
			}
		}
	}
	return dist[end];
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> n >> m >> x;

	for(int i = 0; i < m; i++)
	{
		int s, e, t;

		cin >> s >> e >> t;

		adj[s].push_back({ e,t });
	}
	
	int maxLength = 0;
	for(int i = 1; i <= n; i++)
	{
		int goParty = dajik(i, x);
		int goHome = dajik(x, i);

		maxLength = max(maxLength, (goParty + goHome));
	}

	cout << maxLength;
}
반응형

'알고리즘 > boj' 카테고리의 다른 글

BOJ 1654 랜선 자르기  (0) 2023.02.01
BOJ 10816 숫자 카드 2  (0) 2023.02.01
BOJ 2263 트리의 순회  (0) 2023.01.27
BOJ 1167 트리의 지름  (0) 2023.01.18
BOJ 10165 버스 노선  (0) 2023.01.18