알고리즘/PS

[C++] 백준 1238 : 파티

BigmacGood 2022. 4. 16. 23:09

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

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

백준 1238번 파티 문제를 풀었다.

 

최단 경로 중에 가장 긴 경로를 구하는 문제다.

입력 N이 최대 1000개라서 플로이드 와샬 알고리즘은 사용할 수 없다.

간선의 가중치에 음수가 없어서 다익스트라 알고리즘을 사용했다.

 

X마을로 갔다가 다시 자신의 마을로 최단 경로를 통해서 돌아오고 이 값을 기록해야한다.

먼저 X마을로부터 다른 마을까지의 최단 경로를 다익스트라 알고리즘을 사용해서 구한다.

그 다음 첫 번째 마을부터 마지막 마을까지 반복문을 돌면서 각각의 최단 경로를 계산한다.

dist[i][x] + dist[x][i] 의 값은 i번 마을에서 x번 마을로 가는 최단경로와 x번 마을에서 i번 마을로 가는 최단경로를 더한 값이다.

max변수 하나를 설정해서 x마을에 오고 가는데 가장 비용이 친구의 소요시간을 저장하고 출력한다.

 

아래는 전체 코드입니다.

#pragma warning(disable:4996)
#include <iostream>
#include <string>
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define INF 100000000

struct compare {
	bool operator()(pair<int, int> a, pair<int, int> b) {
		return a.second > b.second;
	}
};

vector<pair<int, int>> adj[1001];
priority_queue < pair<int, int>, vector<pair<int, int>>, compare> pq;
vector<int> dist[1001];

void dijkstra(int n) {
	while (!pq.empty()) {
		int cur = pq.top().first;
		int cost = pq.top().second;
		pq.pop();
		for (int i = 0; i < adj[cur].size(); i++) {
			int next = adj[cur][i].first;
			int next_cost = cost + adj[cur][i].second;
			if (dist[n][next] > next_cost) {
				dist[n][next] = next_cost;
				pq.push({ next,next_cost });
			}
		}
	}
}

int main() {
	int n, m, x;
	cin >> n >> m >> x;
	
	int start, end, cost;
	for (int i = 0; i < m; i++) {
		scanf("%d %d %d", &start, &end, &cost);
		adj[start].push_back({ end,cost });
	}

	for (int i = 1; i <= n; i++) {
		dist[i].assign(n + 1, INF);
	}

	// Calculate the shortest path from X node to other nodes
	dist[x][x] = 0;
	pq.push({ x,dist[x][x] });
	dijkstra(x);


	int max = 0;
	int temp;
	for (int i = 1; i <= n; i++) {
		dist[i][i] = 0;
		pq.push({ i,dist[i][i] });
		dijkstra(i);
		temp = dist[i][x] + dist[x][i];
		if (max < temp)
			max = temp;
	}

	cout << max;

	return 0;
}

 

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

[C++] 백준 12851 : 숨바꼭질 2  (0) 2022.04.18
[C++] 백준 14502 : 연구소  (0) 2022.04.17
[C++] 백준 1613 : 역사  (0) 2022.04.16
[C++] 백준 1916 : 최소비용 구하기  (0) 2022.04.15
[C++] 백준 10159 : 저울  (0) 2022.04.15