Cod sursa(job #2128076)

Utilizator prisacalexandruPrisac Alexandru prisacalexandru Data 11 februarie 2018 13:50:00
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<bits/stdc++.h>

using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

const int NMax=50100;
const int oo=(1<<30);

int n,m;
int d[NMax];
bool inCoada[NMax];

vector < pair <int,int> > g[NMax];

struct compara{
	bool operator ()(int a,int b){
	return d[a]>d[b];
	}
};

priority_queue<int, vector<int>, compara> Coada;

void citeste(){
	fin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,c;
		fin>>x>>y>>c;
		g[x].push_back(make_pair(y,c));
	}
}

void dijkstra(int nodStart){
	for(int i=1;i<=n;i++){
		d[i]=oo;
	}	
	d[nodStart]=0;
	Coada.push(nodStart);
	inCoada[nodStart]=1;
	while(!Coada.empty()){
		int nodCurent=Coada.top();
		Coada.pop();
		inCoada[nodCurent]=0;
		for(size_t i=0;i<g[nodCurent].size();i++){
			int vecin=g[nodCurent][i].first;
			int cost= g[nodCurent][i].second;
			if(d[nodCurent]+cost<d[vecin]){
				d[vecin]=d[nodCurent]+cost;
				if(inCoada[vecin]==0){
					Coada.push(vecin);
					inCoada[vecin]=1;
				}
			}
		}
	}
}

void afiseaza(){
	for(int i=1;i<=n;i++){
		if(d[i]==oo) fout<<"0 ";
		else fout<<d[i]<<" ";
	}
}



int main(){
	citeste();
	dijkstra(1);
	afiseaza();
	
	return 0;
}