Cod sursa(job #2269007)

Utilizator b10nd3Oana Mancu b10nd3 Data 25 octombrie 2018 16:56:36
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include<iostream>
#include<fstream>
#include<set>
#include<vector>
#include<string.h>
#include<limits.h>
 
using namespace std;

//are timp mai bun cu priority_queue - vezi fmcm - flux maxim de cost minim
 
const int INF=0x3f3f3f3f;
 
struct node{
	int where;
	int cost;
	node(int _where, int _cost){
		where=_where;
		cost=_cost;
	}
};
 
 
int main(){
	FILE *in=fopen("dijkstra.in","r"), *out=fopen("dijkstra.out","w");
	int i, n, m, from, where, cost;
	set< pair<int,int> > s;
    fscanf(in,"%d %d",&n,&m);
	vector<node> graf[n+1]; vector<node>::iterator it;
	int dist[n+1];
	memset(dist, INF, sizeof dist); 
	dist[1]=0; s.insert(make_pair(0,1));
	for(i=1;i<=m;i++){
        fscanf(in,"%i %i %i", &from, &where, &cost);
        node *nd=new node(where, cost);
		graf[from].push_back(*nd);
	}
	
	while(!s.empty()){
		int sCost=s.begin()->first, sWhere=s.begin()->second; 
		s.erase(s.begin());
		for(it=graf[sWhere].begin(); it!=graf[sWhere].end(); it++){ 
			if( (*it).cost+sCost < dist[(*it).where]){
				if(dist[(*it).where]!=INF) s.erase(s.find(make_pair(dist[(*it).where],(*it).where)));
				dist[(*it).where]=sCost+(*it).cost;
				s.insert(make_pair(dist[(*it).where],(*it).where));
			}
		}
	}
	
	for(i=2;i<=n;i++){
		if(dist[i]==INF) fprintf(out,"0 ");
		else fprintf(out,"%i ",dist[i]);
	}
	
	
	fclose(in); fclose(out);
	return 0;
}