[백준] 1238 파티
업데이트:
백준 1238 파티 문제 풀이입니다.
이 문제는 일반적인 bfs로 풀면 시간초과가 나올만한 노드와 경로 갯수를 가지고 있습니다. 따라서 다익스트라로 접근해야 한다는 것을 알 수 있었습니다.
단방향 그래프이기 때문에 입력받은 순서대로 경로를 만들어주었습니다.
제가 이 문제를 처음에 풀다가 간과한 사실이 하나 있었습니다. 그냥 X번 마을까지 가는 최단거리라 생각했는데 문제를 자세히 보면 오고 가는거리 즉 왕복이 최단으로 되야 했던 것이였습니다.
따라서 우선 모든 학생이 X번 마을까지 도착하는 최단 거리를 다익스트라로 구한 다음에 다시 원래 마을로 돌아가는 다익스트라를 한번 더 돌려서 가장 많은 시간을 소비한 학생을 찾았습니다.
소스코드는 다음과 같습니다.
Source Code:
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
#define MAX 1001
#define INF 987654321
typedef pair<int, int> p;
int N, M, X;
int result = 0;
vector<p> Road[MAX];
int Dist[MAX];
int Destination_Dist[MAX];
void solve(int start) {
priority_queue<p, vector<p>, greater<p>> pq; // cost,start
fill(Dist, Dist + MAX, INF);
pq.push({ 0,start });
Dist[start] = 0;
while (!pq.empty()) {
int cost = pq.top().first;
int cur = pq.top().second;
pq.pop();
for (auto i : Road[cur]) {
int next = i.first;
int next_cost = i.second;
if (Dist[next] > Dist[cur] + next_cost) {
pq.push({ Dist[cur] + next_cost,next });
Dist[next] = Dist[cur] + next_cost;
}
}
}
result = max(result, Dist[X] + Destination_Dist[start]);
}
int main() {
cin >> N >> M >> X;
for (int i = 0; i < M; i++) {
int s, d, t;
cin >> s >> d >> t;
Road[s].push_back({ d,t });
}
priority_queue<p, vector<p>, greater<p>> pq; // cost,start
fill(Destination_Dist, Destination_Dist + MAX, INF);
pq.push({ 0,X });
Destination_Dist[X] = 0;
while (!pq.empty()) {
int cost = pq.top().first;
int cur = pq.top().second;
pq.pop();
for (auto i : Road[cur]) {
int next = i.first;
int next_cost = i.second;
if (Destination_Dist[next] > Destination_Dist[cur] + next_cost) {
pq.push({ Destination_Dist[cur] + next_cost,next });
Destination_Dist[next] = Destination_Dist[cur] + next_cost;
}
}
}
for (int i = 1; i <= N; i++) {
if (i == X) continue;
solve(i);
}
cout << result;
system("pause");
return 0;
}
궁금하신 점은 댓글 남겨 주세요!!
Summary
- 되도록이면 푼 문제들 계속 올리도록 하겠습니다…
- 또 간혹 설명이 이해가 안간다면 말해주시면 그림까지 같이 넣는 노력을 하겠습니다. 감사합니다.
댓글남기기