Cod sursa(job #663982)

Utilizator RengelBotocan Bogdan Rengel Data 19 ianuarie 2012 13:17:07
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<cstdio>
#include<climits>

#define MAX 250005
#define MAX2 50005
#define inf INT_MAX

int X[MAX],Y[MAX],C[MAX];
int D[MAX2],F[MAX2],T[MAX2];
int m,n;

void read(){
	
	freopen("dijkstra.in","r",stdin);
	
	scanf("%d%d",&n,&m);
	int nod_pornire = 1;
	
	/*	Setez toate distantele din D cu inf	*/
	for(int i=1;i<=n;i++)
		if(i!=nod_pornire)
			D[i]=inf;
	
	/*	Am trecut prin nodul de pornire	(1)	*/
	F[nod_pornire]++;
	
	/*	Read si initializez D pentru nodul de plecare (1)	*/
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&X[i],&Y[i],&C[i]);
		if(X[i]==nod_pornire){
			D[Y[i]]=C[i];
			T[Y[i]]=nod_pornire;
		}
	}
	
	fclose(stdin);
	
}

void min_dist(int &min,int &poz){
	
	min=inf;
	for(int i=1;i<=n;i++){
		
		if(min>D[i] && !F[i]){
			min=D[i];
			poz=i;
		}
		
	}
	
}

void dijkstra(){
	
	for(int i=1;i<n;i++){
		
		/*	Caut distanta minima din D si retin si pozitia acestuia	si selecez nodul poz*/
		int min,poz;
		min_dist(min,poz);
		F[poz]++;
		
		/*	Verific daca prin nodul poz nu gasesc un drum mai scurt catre celelalte noduri	*/
		for(int j=1;j<=m;j++)
			if(X[j]==poz && !F[Y[j]])	// Verific daca X este nodul de care am nevoie
				if(min+C[j]<D[Y[j]]){
					D[Y[j]]=min+C[j];
					T[Y[j]]=poz;
				}
		
	}
	
}

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

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