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:

/*
* 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;
}