노는게제일좋아! 2021. 1. 4. 00:24
반응형

문제: www.acmicpc.net/problem/1753

 

소스 코드:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <queue>
#define inf 1000000000
using namespace std;

typedef pair<int, int> PI;
int vertex, edge, start;
int dist[20002];
bool visit[20002];
vector<vector<PI>> adj;

void dijkstra()
{
    fill(dist, dist + vertex + 1, inf);
    priority_queue<PI, vector<PI>, greater<PI>> pq;
    dist[start] = 0;
    pq.push({0, start});

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

        if (visit[cur])
            break;
        visit[cur] = true;

        for (PI next : adj[cur])
        {
            if (dist[next.first] > dist[cur] + next.second)
            {
                dist[next.first] = dist[cur] + next.second;
                pq.push({dist[next.first], next.first});
            }
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> vertex >> edge >> start;

    adj.resize(vertex + 1);
    for (int i = 0; i < edge; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
    }
    dijkstra();

    for (int i = 1; i <= vertex; i++)
    {
        if (dist[i] == inf) cout << "INF\n";
        else
            cout << dist[i] << '\n';
    }

    return 0;
}
반응형