Pagini recente » Cod sursa (job #2852619) | Cod sursa (job #3198949) | Cod sursa (job #1522511) | Cod sursa (job #22229) | Cod sursa (job #402695)
Cod sursa(job #402695)
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 200
using namespace std;
FILE *f = fopen("distante.in", "r"), *g = fopen("distante.out", "w");
struct nodus
{
int cost, nod;
}ob;
vector<nodus> v[NMAX];
int T, N, M, S, i, j;
int outCost[NMAX], inCost[NMAX];
void read(void)
{
int x, y, z;
fscanf(f, "%d%d%d", &N, &M, &S);
for(i = 1; i <= N; ++i)
fscanf(f, "%d", &inCost[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);
ob.nod = x;
v[y].push_back(ob);
}
}
void calc(void)
{
queue<nodus> q;
memset(outCost, -1, (N + 1) * sizeof(int));
ob.cost = 0;
ob.nod = S;
outCost[S] = 0;
q.push(ob);
while(!q.empty())
{
nodus el = q.front();
q.pop();
int nod = el.nod;
for(i = 0; i < v[nod].size(); ++i)
{
int adiacNod = v[nod][i].nod, adiacCost = v[nod][i].cost;
if(outCost[adiacNod] == -1 || outCost[adiacNod] > outCost[nod] + adiacCost)
{
outCost[adiacNod] = outCost[nod] + adiacCost;
q.push(v[nod][i]);
}
}
}
}
bool isok(void)
{
for(i = 1; i <= N; ++i)
if(inCost[i] != outCost[i])
return 0;
return 1;
}
void ar(void)
{
fscanf(f, "%d", &T);
for(; T; --T)
{
read();
calc();
if(isok())
fprintf(g, "DA\n");
else
fprintf(g, "NU\n");
for(i = 1; i <= N; ++i)
v[i].clear();
}
}
int main(void)
{
ar();
fclose(f);
fclose(g);
return 0;
}