본문으로 바로가기

[백준]1238번문제

category 카테고리 없음 2017. 7. 3. 11:20


#include <iostream>

#include <vector>

#include <queue>

 

#define MAX_NODE    1000

#define INFINITE    1000000


using namespace std;

 

int N, M, X;

int MinTime[MAX_NODE + 1], dist[MAX_NODE + 1];

vector<pair<int, int>> adj[MAX_NODE + 1];


int dikstra(int from, int to)

{

    priority_queue<pair<int, int>,vector<pair<int, int> >,greater<pair<int, int> > > pq; //작은수가 우선순위임.


    for (int i = 1; i <= N; i++)

        dist[i] = INFINITE;

 

    dist[from] = 0;

    pq.push(make_pair(0, from));

     

    while (!pq.empty())

    {

        int min_dist = pq.top().first;

        int min_node = pq.top().second;

        pq.pop();

 

        for (int v = 0; v < adj[min_node].size(); v++) {

            int next_node = adj[min_node][v].first;

            int next_dist = min_dist + adj[min_node][v].second;

            

if (next_dist < dist[next_node]) {

                dist[next_node] = next_dist;

                pq.push(make_pair(next_dist, next_node));

            }


        }

    }

    return dist[to];

}

 

int main()

{

    int MaxTime = 0;

 

    cin >> N >> M >> X;


    for (int i = 0; i < M; i++) {

        int from, to, time;

        cin >> from >> to >> time;


        adj[from].push_back(make_pair(to, time));

    }

 

    for (int v = 1; v <= N; v++)

    {

        if (v == X) continue;

        MinTime[v] = dikstra(v, X);

    }


    dikstra(X, 1); //특정 지점 노드에서 다른노드까지 최단거리 거리구하기 위함. 1은 그냥 임의의 값.

 

    for (int v = 1; v <= N; v++)

    {

        MinTime[v] += dist[v];

        if (MaxTime < MinTime[v])

            MaxTime = MinTime[v];

    }

    cout << MaxTime;

    return 0;

}



//간단히 요약하자면 먼저 각 노드의 최단거리의 값을 구한다음 특정 노드에서 다른 노드들 까지의 최단거리를 구하면 된다.