본문 바로가기
Programming Solve/BOJ

BOJ 1238 - 파티 / C++

by msm1029 2022. 3. 20.
반응형

문제 링크 : 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

 

 

풀이

먼저 X 노드에서 다른 모든 노드들간의 거리를 구한다.

다음으로, 1부터 n번 노드까지 모두 다익스트라를 수행한다.

노드의 개수가 최대 1000개이므로 우선순위 큐로 구현하였다면 시간 초과가 나지 않는다.

 

i번 노드에서 X번 노드까지의 거리를 임시 변수 tmp에 더하고

X번 노드에서 i번 노드까지의 거리도 tmp에 더하면 왕복 거리가 완성되고

이를 후보 배열 candidates에 넣는다.

 

따라서, candidates 배열에는 모든 왕복거리가 저장되어 있고

이 중 가장 큰 값을 출력하면 된다.

 

코드

#include <bits/stdc++.h>
using namespace std;

#define MAX 1001
#define INF 2147483647

int n, m, x; //n명의 학생(정점), m개의 도로(간선), x번 마을에 모여서 파티
vector<pair<int, int> > graph[MAX];
int dist[MAX];
int distForX[MAX];

void Dijkstra(int start){
    priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > pq;
    pq.push(make_pair(0, start));
    //우선순위 큐를 사용하기 위해 first는 가중치, second는 노드
    dist[start] = 0;

    while(!pq.empty()){
        int curDist = pq.top().first;
        int curNode = pq.top().second;
        pq.pop();

        for(int i=0; i<graph[curNode].size(); i++){
            int nextNode = graph[curNode][i].first;
            int nextDist = graph[curNode][i].second;
            
            if(dist[nextNode] > curDist + nextDist){
                dist[nextNode] = curDist + nextDist;
                pq.push(make_pair(dist[nextNode], nextNode));
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    cin >> n >> m >> x;

    for(int i=0; i<m; i++){
        int a, b, c; //시작점, 끝점, 가중치
        cin >> a >> b >> c;
        graph[a].push_back(make_pair(b, c));
    }

    for(int i=1; i<=n; i++){
        dist[i] = INF;
    }

    Dijkstra(x);
    for(int i=1; i<=n; i++){
        distForX[i] = dist[i];
        dist[i] = INF;
    }


    vector<int> candidates;
    
    for(int i=1; i<=n; i++){
        int tmp = 0;
        Dijkstra(i);

        tmp += dist[x];
        tmp += distForX[i];

        for(int j=1; j<=n; j++){
            dist[j] = INF;
        }

        candidates.push_back(tmp);
    }

    cout << *max_element(candidates.begin(), candidates.end());
}

 

반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 1913 - 달팽이 / C++  (0) 2022.03.22
BOJ 4486 - 녹색 옷 입은 애가 젤다지? / C++  (0) 2022.03.20
BOJ 2503 - 숫자 야구 / C++  (0) 2022.03.10
BOJ 1120 - 문자열 / C++  (0) 2022.03.08
BOJ 1654 - 랜선 자르기 / C++  (0) 2022.03.04