Pagini recente » Cod sursa (job #671236) | Cod sursa (job #2847994) | Cod sursa (job #2778556) | Cod sursa (job #2329224) | Cod sursa (job #2231498)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define maxn 50005
using namespace std;
const int alot = 2e9;
int N, M, S;
int precalc[maxn];
int dist[maxn];
unsigned char vizitat[maxn];
class cmp{
public:
bool operator () (pair <int, int> p1, pair <int, int> p2)
{
return p1.second > p2.second;
}
};
vector <pair <int, int> > G[maxn];
priority_queue <pair <int, int>,
vector<pair <int, int> >,
cmp> Q;
int main()
{
ifstream in ("distante.in");
ofstream out ("distante.out");
int t;
in>>t;
while(t--)
{
in>>N>>M>>S;
for(int i = 0; i <= N; ++i)
{
G[i].clear();
vizitat[i] = 0;
}
while(!Q.empty())
Q.pop();
int x, y, c;
for(int i = 1; i <= N; ++i)
in>>precalc[i];
for(int i = 1; i <= M; ++i)
{
in>>x>>y>>c;
G[x].push_back({y, c});
}
for(int i = 1; i <= N; ++i)
dist[i] = alot;
dist[S] = 0;
Q.push(make_pair(S, dist[S]));
while(!Q.empty())
{
int cur = Q.top().first;
Q.pop();
if(vizitat[cur])
continue;
vizitat[cur] = 1;
for(int i = 0; i < G[cur].size(); ++i)
{
int succ = G[cur][i].first;
if (dist[succ] > dist[cur] + G[cur][i].second)
{
dist[succ] = dist[cur] + G[cur][i].second;
Q.push(make_pair(succ, dist[succ]));
}
}
}
for (int i = 1; i <= N; ++i)
if(dist[i] != precalc[i])
goto hell;
out<<"DA\n";
continue;
hell:
out<<"NU\n";
}
return 0;
}