티스토리 뷰

백준 (BOJ)/다익스트라

백준)1238-파티

플레지 2019. 4. 27. 22:49

문제링크: https://www.acmicpc.net/problem/1238

 

1238번: 파티

문제 N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다. 어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다. 각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다. 이 도로들은 단방향이기 때

www.acmicpc.net

문제

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<intint > > 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
링크
«   2025/01   »
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
글 보관함