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

 

1238번: 파티

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

www.acmicpc.net

 문제 설명 

 

1. 각 마을에는 한명의 학생이살고 각 마을마다 파티가 열린다.

2. 각 마을로 이동하는 단방향 그래프가 주어짐

3. 학생들이 모든 마을을 다들리고 집에돌아오는 시간이 가장 오래걸리는 학생의 소요 시간 출력. 

 

 알고리즘 

 

1. 각학생(마을) 별로 다익스트라를 돌린다..

2. 마을별로 각 마을을 도는 데 드는 시간을 모두 합하여 최대 값을 출력한다.

 

 코드 

 

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
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
 
using namespace std;
typedef pair<intint> P;
 
int INF = 9867654321;
int N, M, X;
int check[1001][1001];
vector<P> v[1001];
 
void dijkstra(int start) {
    check[start][start] = 0;
    priority_queue<P> pq;
    pq.push(P(0,start));
    while (!pq.empty()) {
        int curr = pq.top().second;
        int dis = -pq.top().first;
        pq.pop();
 
        if (check[start][curr] < dis) {
            continue;
        }
 
        for (int i = 0; i < v[curr].size(); i++) {
            int next = v[curr][i].first;
            int next_dis =dis+ v[curr][i].second;
 
            if (next_dis < check[start][next]) {
                check[start][next] = next_dis;
                pq.push(P(-next_dis, next));
            }
        }
 
    }
 
 
}
 
int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
    cin >> N >> M >> X;
 
 
    //간선 입력
    for (int i = 0; i < M; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        v[a].push_back(P(b, c));
    }
 
    //배열 초기화
    for (int i = 0; i <= N; i++) {
        for (int j = 0; j <= N; j++) {
            check[i][j] = INF;
        }
    }
 
    //다익스트라
    for (int i = 1; i <= N; i++) {
        dijkstra(i);
    }
 
    //결과값
    int result = 0;
    for (int i = 1; i <= N; i++) {
        result = max(result, check[i][X] + check[X][i]);
    }
 
    cout << result;
 
 
}
cs

'c++ > 백준' 카테고리의 다른 글

백준 2211번: 네트워크 복구  (0) 2020.05.07
백준 2138번 : 전구와 스위치  (0) 2020.05.04
백준 1504번 : 특정한 최단 경로  (0) 2020.04.30
백준 1753번: 최단 경로  (0) 2020.04.30
백준 1261번: 알고 스팟  (0) 2020.04.30
ariz1623