알고리즘&자료구조/문제

[BOJ] 1238 파티 C++

Nakuri 2023. 3. 7. 23:02
728x90

개요

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

골드3 난이도 문제!

풀이

학생들이 파티가 열리는 마을에 갔다가 자신의 마을로 돌아와야한다.

이러한 학생들중 가장 오래 걸리는 학생의 소요시간을 출력하면 된다.

우선순위 큐를 이용한 다익스트라를 사용했다.(O(ElogE))

Dijkstra 함수의 매개변수로 출발지와 목적지를 받았다.

목적지에 도착했을 경우, 파티 장소인지 체크 후 파티장소일 경우 집을 목적지로 Dijkstra를 재귀호출했다.

이후 리턴 값을 받아 합이 가장 큰(소요시간이 가장 긴) 결과를 출력하면 끝!

코드

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
constexpr int LIMIT = 1002;
constexpr int MAX = 2123456789;
struct Info{
	int node;
	int cost;
};
struct cmp{
	bool operator()(Info &l, Info &r){
		return l.cost>r.cost;
	}
};

vector<Info> graph[LIMIT];
int N, M, X;
int ans;


int Dijkstra(int start, int end)
{
	priority_queue<Info, vector<Info>, cmp> pq;
	int distance[N+1];
	bool visited[N+1]{};
	for(auto &d : distance)
		d = MAX;
	visited[start] = true;

	pq.push({start, 0});

	while(!pq.empty())
	{
		auto [cur, sum] = pq.top();
		visited[cur] = true;
		pq.pop();

		if(cur == end)
		{
			if(end == X && start != end)
			{
				sum += Dijkstra(end, start);
				if(ans < sum) ans = sum;
			} 
			return sum;
		}

		for(int i=0; i<graph[cur].size(); i++)
		{
			Info next = graph[cur][i];
			if(visited[next.node]) continue;
			int nSum = sum + next.cost;
			if(distance[next.node] < nSum) continue;
			pq.push({next.node, nSum});
		}
	}

}

int main()
{
	cin.tie(0)->sync_with_stdio(0);

	cin >> N >> M >> X;
	int s,e,t;
	for(int i=0; i<M; i++)
	{
		cin >> s >> e >> t;
		graph[s].push_back({e,t});
	}

	for(int i=1; i<=N; i++)
	{
		int cost = Dijkstra(i,X);
		if(ans < cost) ans = cost;
	}

	cout << ans;
}

'알고리즘&자료구조 > 문제' 카테고리의 다른 글

[BOJ] 2302 극장 좌석 C++  (0) 2023.05.15
[BOJ] 9372 상근이의 여행 C++  (0) 2023.03.28
[BOJ] 5972 택배 배송 C++  (0) 2023.03.06
[BOJ] 1043 거짓말 C++  (1) 2023.02.24
[BOJ] 1976 여행 가자 C++  (0) 2023.02.24