Cod sursa(job #632861)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 12 noiembrie 2011 14:20:25
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <cstdio>
#include <vector>

using namespace std;

const int N=100001;
const int M=250001;
const int INF=1<<30;

const int PARS=10000;

vector < pair<int,int> > edge[N];

int cost[N],n,m,vizitate,heapsize;
bool viz[N];
char buff[PARS];
int pozitie=PARS-1;

void citire(int &nr){
    nr=0;
    while(buff[pozitie]<'0' || buff[pozitie]>'9')
        if (++pozitie==PARS){
            fread (buff,1,PARS,stdin);
            pozitie=0;
        }
    while('0'<=buff[pozitie] && buff[pozitie]<='9'){
        nr=nr*10+buff[pozitie]-'0';
        if (++pozitie==PARS){
            fread (buff,1,PARS,stdin);
            pozitie=0;
        }
     }
}

void Dijkstra(){
	int i,costaux,nod,vizitate=0,min;
	for(i=2;i<=n;++i){
		cost[i]=INF;
	}
	nod=1;
	while(vizitate!=n){
		viz[nod]=1;
		costaux=cost[nod];
		for(i=0;i<edge[nod].size();++i){
			if(viz[edge[nod][i].first]==0 && costaux+edge[nod][i].second<cost[edge[nod][i].first])
				cost[edge[nod][i].first]=costaux+edge[nod][i].second;
		}
		min=INF;
		for(i=1;i<=n;++i){
			if(cost[i]<=min && viz[i]==0){
				nod=i;
				min=cost[i];
			}
		}
		vizitate++;
	}
}

void read(){
	int a,b,c;
	freopen("dijkstra.in","r",stdin);
	citire(n);
	citire(m);
	for(int i=1;i<=m;i++){
		citire(a);
		citire(b);
		citire(c);
		edge[a].push_back(make_pair(b,c));
	}
}

void write(){
	freopen("dijkstra.out","w",stdout);
	for(int i=2;i<=n;++i){
		if(cost[i]==INF){
			printf("0 ");
			continue;
		}
		printf("%d ",cost[i]);
	}
}

int main(){
	read();
	Dijkstra();
	write();
	return 0;
}