Cod sursa(job #663682)

Utilizator RengelBotocan Bogdan Rengel Data 18 ianuarie 2012 20:27:18
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<climits>

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

int X[MAX],Y[MAX],Cost[MAX];
int D[MAX2],S[MAX2],T[MAX2];
int n,m;

void read(){
	
	freopen("dijkstra.in","r",stdin);
	
	scanf("%d%d",&n,&m);
	
	/*	Initializare */
	for(int i=2;i<=n;i++)
		D[i]=inf;
	S[1]++;
	
	/*	Citire si initializarea array-ului de costuri D */
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&X[i],&Y[i],&Cost[i]);
		if(X[i]==1){
			D[Y[i]]=Cost[i];
			T[Y[i]]=1;
		}
	}
	
	fclose(stdin);
	
}

void NOD(int &nod,int &min){
	
	min=INT_MAX;
	for(int i=1;i<=n;i++)
		if(!S[i] && D[i]<min){
			min=D[i];
			nod=i;
		}
	
}

void Dijkstra(){
	
	for(int i=1;i<=n-1;i++){
		
		/* Caut minimul din D cu proprietatea ca S[i] = 0 */
		int nod,min;
		NOD(nod,min);
		
		/* Selectez nodul */
		S[nod]++;
		
		/* Caut o ruta mai scurta prin nod pentru a ajunge la restul nodurilor */
		for(int j=1;j<=m;j++)
			if(X[j]==nod && !S[Y[j]])
				if(min+Cost[j]<D[Y[j]]){
					D[Y[j]]=min+Cost[j];
					T[Y[j]]=nod;
				}
		
		/*  */
		
		
	}
	
}

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

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