Dijkstra

Problem:

Given a bidirectional graph of N (1 \le N \le 50000) vertices and M (N-1 \le M \le 100000) edges and the weight w_i (0 \le w_i \le 1000) of each edge, find the shortest path from node 1 to each node.

Input (file.in):

Line 1: Two integers, N and M.
Lines 2 \ldots M+1: Three integers, a, b, and t that represent the weight of the edge between nodes a and b is t.

Output (file.out):

Lines 1 \ldots N: The distance from node 1 to node i.

Solution:

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
/*
* Example Dijkstra with Priority Queue and Adjacency List
* Albert Gural
*/
 
#include <fstream>
#include <vector>
#include <queue>
 
using namespace std;
FILE *fin  = fopen("file.in""r");
FILE *fout = fopen("file.out", "w");
int N, M, a, b, t;   // N = nodes, M = edges, t is dist from a to b
int     dist[50005]; // distance from node 1
bool visited[50005]; // whether a node has been processed
vector<pair<int,int> > edges[50005]; // Adjacency List
vector<pair<int,int> >::iterator it;
 
int main () {
    fscanf(fin, "%d %d", &N, &M);
 
    // Initialize adjacency list with empty vectors.
    for(int i = 0; i <= N; i++) {
        vector<pair<int,int> > v;
        edges[i] = v;
    }
 
    // Initialize distances (all but node 1 are at "infinity").
    dist[1] = 0;
    for(int i = 2; i <= N; i++)
        dist[i] = 1000000000;
 
    // Fill Adjacency list with data from input.
    for(int i = 0; i < M; i++) {
        fscanf(fin, "%d %d %d", &a, &b, &t);
        edges[a].push_back(make_pair(b, t));
        edges[b].push_back(make_pair(a, t));
    }
 
    // Initialize Priority Queue with first node.
    // Priority Queue will be a collection of Pair<int, int>.
    // First element gives distance from x to node 1.
    // Second element gives x.
    priority_queue<pair<int,int>, vector<pair<int, int> >,
        greater<pair<int,int> > > q;
    q.push(make_pair(0,1));
 
    // Dijkstra
    while(!q.empty()) {
        int cur = q.top().second;   // Current Node
        int dcur = q.top().first;   // Current Node's Distance
        q.pop();                    // Remove top element.
        if(visited[cur]) continue;
        visited[cur] = true;
 
        // Look at each node adjacent to the current node.
        // If the distance to those nodes + current distance is
        // less than the current distance of those nodes, update it
        // and add it to the queue.
        for(it = edges[cur].begin(); it != edges[cur].end(); it++) {
            int nextNode = (*it).first;  // Adjacent node to cur
            int distNext = (*it).second; // Dist from adj. node to cur
            if(dist[nextNode] > dcur + distNext) {
                dist[nextNode] = dcur + distNext;
                q.push(make_pair(dist[nextNode], nextNode));
            }
        }
    }
 
    // The shortest path from node 1 to all other nodes is
    // now stored in the dist array.  Print each value of dist.
    for(int i = 1; i <= N; i++)
        fprintf(fout, "%d\n", dist[i]);
    return 0;
}