티스토리 뷰
문제링크: https://www.acmicpc.net/problem/1238
문제
N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.
어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다.
각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.
이 도로들은 단방향이기 때문에 아마 그들이 오고 가는 길이 다를지도 모른다. N명의 학생들 중 오고 가는데 가장 많은 시간을 소비하는 학생은 누구일지 구하여라.
입력
첫째 줄에 N(1 <= N <= 1,000), M(1 <= M <= 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어온다.
모든 학생들은 집에서 X에 갈수 있고, X에서 집으로 돌아올 수 있는 데이터만 입력으로 주어진다.
출력
첫 번째 줄에 N명의 학생들 중 오고 가는데 가장 오래 걸리는 학생의 소요시간을 출력한다.
-------------------------------------------------------------------------------------------------------------------------------
풀이
각 정점에서 목표 정점까지 최소 거리를 원하므로 우선순위큐 를 이용하여 거리를 계산해 주었다.
이때 문제에서 원하는 조건은 집에서 파티장을 갔다가 다시 집으로 복귀 하는 것 이므로
집에서 파티장 X 까지갈때 걸리는 시간 + 파티장 X 에서 집까지 걸리는 시간 중 최대 값을 출력해주어야 한다.
-------------------------------------------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int N , M , X ;
vector<pair<int, int > > a[1001];
//집으로 돌아가는 다익스트라 알고리즘.
vector<int> PartyEnd(int x)
{
vector<int> ans(N+1,987654321);
priority_queue<pair< int ,int > >q;
q.push({ 0 , x });
ans[x]=0;
while( !q.empty() )
{
int cur = q.top().second;
int cost = -q.top().first;
q.pop();
if(ans[cur] < cost ) continue;
for(int i= 0 ; i< a[cur].size() ; i++)
{
int next = a[cur][i].second ;
int nextcost = a[cur][i].first + cost ;
if(ans[next] > nextcost)
{
ans[next] = nextcost;
q.push({-nextcost , next});
}
}
}
return ans;
}
//파팅장으로 가는 알고리즘
int PartyStart(int l)
{
vector<int> ans(N+1,987654321);
priority_queue<pair< int ,int > >q;
q.push({ 0 , l });
ans[l]=0;
while( !q.empty() )
{
int cur = q.top().second;
int cost = -q.top().first;
q.pop();
if(ans[cur] < cost ) continue;
for(int i= 0 ; i< a[cur].size() ; i++)
{
int next = a[cur][i].second ;
int nextcost = a[cur][i].first + cost ;
if(ans[next] > nextcost)
{
ans[next] = nextcost;
q.push({-nextcost , next});
}
}
}
return ans[X];
}
int main()
{
int i,j;
cin >> N >> M >> X;
int u , v, w ;
for(i = 0 ; i< M ; i++)
{
cin >> u >> v >> w;
a[u].push_back({w,v});
}
vector<int > sec = PartyEnd(X); // 집으로 돌아가는길.
int Max = 0 ;
for(i=1; i<= N ; i++)
Max = max( Max , sec[i] + PartyStart(i) );
cout << Max;
return 0;
}
|
c |
'백준 (BOJ) > 다익스트라' 카테고리의 다른 글
백준)1261-알고스팟 (0) | 2019.04.28 |
---|---|
백준)1916-최소비용 구하기 (0) | 2019.04.27 |
백준)1753-최단경로 (0) | 2019.04.27 |
- Total
- Today
- Yesterday
- 그리디
- 라오킹전사
- A
- #스페인어 #스페인어인강 #스페인어공부 #시원스쿨스페인어
- 그래프
- 백트레킹
- php
- 이분매칭
- 정렬
- 이분 매칭
- greedy
- 라이즈오브킹덤즈
- JavaSwing
- 다익스트라
- 사이클
- 그리디알고리즘
- 백트래킹
- HTML
- 사이크
- 플로이드
- CSS
- dfs
- BFS
- stri
- KVK4
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |