Pagini recente » Cod sursa (job #3209329) | Cod sursa (job #732626) | Cod sursa (job #2913267) | Cod sursa (job #2809525) | Cod sursa (job #2103720)
#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;
}