Pagini recente » Cod sursa (job #2881499) | Cod sursa (job #2553272) | Cod sursa (job #3161979) | Cod sursa (job #307803) | Cod sursa (job #398710)
Cod sursa(job #398710)
#include <iostream>
#include <ctime>
#include <vector>
#include <queue>
#define NMAX 50010
using namespace std;
int N, M, i, x, y, z, S;
struct asd
{
int cost, nod;
bool operator < (const asd& var) const
{
return cost > var.cost;
}
}w, ob;
vector<asd> v [ NMAX ];
priority_queue<asd> pq;
int cd[NMAX];
int final[NMAX];
int zxc[NMAX];
void dijkstra(void)
{
memset(cd, -1, sizeof(cd));
w.cost = 0;
w.nod = S;
pq.push(w);
for(i = 1; i <= N;)
//while(!pq.empty())
{
if(pq.empty())break;
asd el = pq.top();
pq.pop();
int sz = pq.size();
if(final[el.nod] == 0)
{
++i;
//cd[el.nod] = el.cost;
final[el.nod] = 1;
for(int j = 0; j < v[el.nod].size(); ++j)
{
int nod = el.nod, adiacNod = v[nod][j].nod;
int cost = el.cost, adiacCost = v[nod][j].cost + cost;
if(final[adiacNod] == 0)
{
if(adiacCost < cd[adiacNod] || cd[adiacNod] == -1){
cd[adiacNod]=adiacCost;
w.cost = adiacCost; w.nod = adiacNod; pq.push(w);
}
}
}
}
}
}
void solve(void)
{
FILE *f = fopen("distante.in", "r");
FILE *g = fopen("distante.out", "w");
int T;
fscanf(f, "%d", &T);
for(; T; --T)
{
fscanf(f, "%d%d%d", &N, &M, &S);
for(i = 1; i <= N; ++i)
fscanf(f, "%d", &zxc[i]);
for(i = 1; i <= M; ++i)
{
fscanf(f, "%d%d%d", &x, &y, &z);
ob.nod = y;
ob.cost = z;
v[x].push_back(ob);
}
dijkstra();
bool sw = 1;
for(i = 1; i <= N; ++i)
{
if(cd[i] == -1)
cd[i] = 0;
if(cd[i] != zxc[i])
{
sw = 0;
break;
}
}
if(sw)
fprintf(g, "DA\n");
else
fprintf(g, "NU\n");
}
fclose(f);
fclose(g);
}
int main(void)
{
solve();
return 0;
}