Cod sursa(job #1826990)

Utilizator eilerGabriel-Ciprian Stanciu eiler Data 11 decembrie 2016 12:00:55
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <vector>
#include <fstream>
#define MAX 50000
#define INF 2000000000
using namespace std;

int T, N, M, S, D[MAX], Di[MAX];
bool used[MAX];
vector <int> C[MAX];

void initC(){
	int i, j;
	for (i=0; i<N; i++){
		C[i].clear();
		for (j=0; j<N; j++)
			C[i].push_back(INF);
	}
}

void initR(){
	int i;
	for (i=0; i<N; i++){
		used[i]=false;
		Di[i]=C[i][S];
	}
}

int main(){
	int i, j, k, x, dist;

	ifstream fin ("distante.in");
	ofstream fout ("distante.out");
	fin >> T;
	for (x=0; x<T; x++){
		fin >> N >> M >> S; S--;

		for (i=0; i<N; i++)
			fin >> D[i];
		initC();
		for (i=0; i<M; i++){
			fin >> j >> k >> dist;
			j--; k--;
			C[j][k]=C[k][j]=dist;
		}
		initR();

		used[S]=true;
		Di[S]=0;
		for (i=0; i<N-1; i++){
			dist=INF;
			for (j=0; j<N; j++)
			  if (used[j]==false && Di[j]<dist){
					dist=Di[j];
					k=j;
			  }
			used[k]=true;
			for (j=0; j<N; j++)
			  if (Di[j]>Di[k]+C[k][j])
					Di[j]=Di[k]+C[k][j];
		}

		i=0;
		while (i<N && Di[i]==D[i])
			i++;
		if (i==N)
			fout << "DA\n";
		else
			fout << "NU\n";
	}
	fin.close();
	fout.close();

	return 0;
}