Pagini recente » Cod sursa (job #2098374) | Cod sursa (job #3162614) | Cod sursa (job #1099666) | Cod sursa (job #2294571) | Cod sursa (job #2140644)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define NMax 50005
#define oo (1 << 3)
ifstream fin("distante.in");
ofstream fout("distante.out");
int T, N, M, S;
int D1[NMax], D[NMax], InCoada[NMax];
vector < pair < int, int > > a[NMax];
struct comp
{
bool operator()(int x, int y)
{
return D[x] > D[y];
}
};
priority_queue <int, vector < int >, comp > q;
void Dijkstra(int start)
{
for(int i = 1; i <= N; i++)
{
D[i] = oo;
InCoada[i] = 0;
}
D[start] = 0;
q.push(start);
InCoada[start] = 1;
while(!q.empty())
{
int curent = q.top();
q.pop();
InCoada[curent] = 0;
for(unsigned int i = 0; i < a[curent].size(); i++)
{
int vecin = a[curent][i].first;
int cost = a[curent][i].second;
if(D[curent] + cost < D[vecin])
{
D[vecin] = D[curent] + cost;
if(!InCoada[vecin])
{
q.push(vecin);
InCoada[vecin] = 1;
}
}
}
}
}
void Print()
{
int t = 1;
for(int i = 1; i <= N; i++)
{
if(D[i] != D1[i])
{
t = 0;
break;
}
}
if(t == 1) fout << "DA" << "\n";
else fout << "NU" << "\n";
}
void Read()
{
fin >> T;
for(int i = 1; i <= T; i++)
{
fin >> N >> M >> S;
for(int j = 1; j <= N; j++)
{
fin >> D1[j];
}
for(int j = 1; j <= M; j++)
{
int x, y, c;
fin >> x >> y >> c;
a[x].push_back(make_pair(y, c));
a[y].push_back(make_pair(x, c));
}
Dijkstra(S);
Print();
}
}
int main()
{
Read();
}