Cod sursa(job #1191112)

Utilizator xoSauceSergiu Ferentz xoSauce Data 26 mai 2014 16:57:40
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <vector>
#include <memory.h>
#include <queue>
#include <cstdio>
#define inf (1<<31)-1
using namespace std;


struct node{
	int nextNode;
	int cost;
	node(int aNode,int aCost){
		nextNode = aNode;
		cost = aCost;
	}	
};

int n,m;
vector<node>G[50005];
int dist[50005];

class CMP{
public:
	bool operator()(int a,int b){
		return dist[a] >= dist[b];
	}

};

priority_queue<int, vector<int>, CMP> pq;
bool mark[50005];
void dijkstra(int start){
	for(int i = 0 ; i <= n ;i++)
		dist[i] = inf;
	
	dist[start] = 0;
	for(int i = 0 ; i < G[start].size(); i++){
		dist[G[start][i].nextNode] = G[start][i].cost;
	}
	pq.push(start);
	mark[start] = true;
	while(!pq.empty()){
		int top = pq.top();
		pq.pop();
		for(int i = 0 ;i < G[top].size(); i++){
			int nextNode = G[top][i].nextNode;
			
				if(dist[nextNode] >= dist[top] + G[top][i].cost){
					dist[nextNode] = dist[top] + G[top][i].cost;
					if(!mark[nextNode])
						pq.push(nextNode);
				}
			
		}

		mark[top] = true;
	}

	for(int i = 2; i <= n; i++){
		if(dist[i] == inf)
			printf("0 ");
		else
			printf("%d ",dist[i]);
	}
	printf("\n");
}

void read(){

	scanf("%d %d",&n,&m);
	for(int i = 0; i < m; i++){
		int x,y,c;
		scanf("%d %d %d",&x,&y,&c);
		G[x].push_back(node(y,c));
	}	
}

int main(){

	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	read();
	dijkstra(1);
	return 0;
}