Cod sursa(job #1836755)

Utilizator flibiaVisanu Cristian flibia Data 28 decembrie 2016 17:19:00
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define st first
#define nd second

using namespace std;

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

vector <pair <int, int> > v[250006];
int n, m, a, b, c, d[250006]; bool viz[50006];
pair <int, int> x;

int main(){
	in >> n >> m;
	//for(int i = 1; i <= n; i++) d[i] = INF;
	//d[1] = 0;
	
	memset(d, INF, sizeof(d));
	d[1] = 0;
	
	for(int i = 1; i <= m; i++){
		in >> a >> b >> c;
		
		v[a].push_back(mp(b, c));
	}
	
	set <pair <int, int> > myset;
	
	myset.insert(mp(1, 0));
	
	while(!myset.empty()){
		
		int nodcur = myset.begin()->st;
		int distcur = myset.begin()->nd;	
		myset.erase(myset.begin());
	
		for(vector <pair <int, int> > ::iterator it = v[nodcur].begin(); it != v[nodcur].end(); ++it){
			
			int nodul = it->st;
			int costul = it->nd;
			
			if(d[nodcur] + costul < d[nodul]){
				
				if(d[nodul] != INF){
					x.st = nodul;
					x.nd = d[nodul];
					myset.erase(myset.find(x));
				}
				
				d[nodul] = d[nodcur] + costul;
				x.st = nodul;
				x.nd = d[nodul];
				myset.insert(x);			
				
			}			
			
		}
		
	}
	
	for(int i = 2; i <= n; i++)
		if(d[i] == INF) out << "0 ";
		else out << d[i] << ' ';
	
	return 0;
}