[적용한 알고리즘]

다익스트라

 

[아이디어]

내용

 

[생각의 흐름 / 절차] 

내용

 

[교훈]

잠이 안와서 푸는 기본문제2

 

<코드>

#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

const int MAX_V = 20001;
const int INF = 1000000000;
typedef pair<int, int> P;

int main(){
    int t; scanf("%d", &t);

    while (t--){
        int V, E, K;
        vector<P> adj[MAX_V];
        scanf("%d %d %d", &V, &E, &K);

        for (int i = 0; i < E; i++){
            int from, to, cost;
            scanf("%d %d %d", &to, &from, &cost);
            adj[from].push_back(P(to, cost));
        }

        int dist[MAX_V];
        fill(dist, dist + MAX_V, INF);
        bool visited[MAX_V] = { 0 };
        priority_queue<P, vector<P>, greater<P>> PQ;

        dist[K] = 0;
        PQ.push(P(0, K));

        while (!PQ.empty()){
            int cur;
            do {
                cur = PQ.top().second;
                PQ.pop();
            } while (!PQ.empty() && visited[cur]);

            if (visited[cur]) break;

            visited[cur] = true;
            for (auto &p : adj[cur]){
                int nxt_node = p.first;
                int nxt_cost = p.second;

                if (dist[nxt_node] > dist[cur] + nxt_cost){
                    dist[nxt_node] = dist[cur] + nxt_cost;
                    PQ.push(P(dist[nxt_node], nxt_node));
                }
            }
        }
        int ans_cnt = 0;
        int ans_time = -1;

        for (int i = 1; i <= V; i++){
            if (dist[i] == INF) continue;
            ans_cnt++;
            ans_time = max(ans_time, dist[i]);
        }

        printf("%d %d\n", ans_cnt, ans_time);
    }
    return 0;
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 2229번 조 짜기  (0) 2020.01.01
[백준] 2300번 기지국  (0) 2019.12.28
[백준] 6118번 숨바꼭질  (0) 2019.12.28
[백준] 1725번 히스토그램  (0) 2019.12.27
[백준] 1005번 ACM Craft  (0) 2019.12.26

+ Recent posts