Cod sursa(job #723664)

Utilizator RengelBotocan Bogdan Rengel Data 25 martie 2012 18:37:59
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<cstdio>
#include<climits>

#define MAX 100005
#define MAX2 50005
#define inf INT_MAX

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

void read(){
	
	freopen("dijkstra.in","r",stdin);
	
	scanf("%d%d",&n,&m,&start);
	int nod_pornire = start;
	
	for(int i=1;i<=n;i++)
		scanf("%d",&Sol[i]);
	
	/*	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 solve(){
	
	int i;
	D[start] = 0;
	for(i=1;i<=n;i++){
		if(D[i]>=inf) D[i] = 0;
		if(D[i]!=Sol[i]){
			printf("NU\n");
			break;
		}
	}
	if(i>n) printf("DA\n");
	
}

int main(){
	
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	
	scanf("%d",&t);
	
	for(int i=1;i<=t;i++){
		
		read();
		dijkstra();
		solve();
		
	}
	
	return 0;
	
}