Cod sursa(job #2103720)

Utilizator cristii2000cristiiPanaite Cristian cristii2000cristii Data 10 ianuarie 2018 18:24:13
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <iostream>
#include <vector>
#define MAX 50005

using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");

int Teste;
int n, m, s;
int Dist[MAX];
bool verif[MAX];

struct edge
{
	int x, y, cost;
}graf[2 * MAX];

void citire()
{
	in >> n >> m >> s;

	for(int i = 1; i <= n; i++)
	{
		in >> Dist[i];
		verif[i] = false;
	}

    for(int i = 1; i <= m; i++)
	{
		in >> graf[i].x >> graf[i].y >> graf[i].cost;
	}
}

bool verificare()
{
    if(Dist[s])
		return false;

	verif[s] = true;

	for(int i = 1; i <= m; i++)
	{
		int X = graf[i].x, Y = graf[i].y, C = graf[i].cost;
		int SumX = Dist[X] + C, SumY = Dist[Y] + C;

		if(SumX < Dist[Y])
			return false;

		if(SumY < Dist[X])
			return false;

		if(SumX == Dist[Y])
			verif[Y] = true;

		if(SumY == Dist[X])
			verif[X] = true;
	}
	for(int i = 1; i <= n; i++)
		if(!verif[i])
		return false;

	return true;
}
int main()
{
	in >> Teste;

	while(Teste--)
	{
		citire();
		if(verificare())
			out << "DA\n";
		else out << "NU\n";
	}

    return 0;
}