Pagini recente » Cod sursa (job #715454) | Cod sursa (job #3273190) | Cod sursa (job #652361) | Cod sursa (job #1215479) | Cod sursa (job #1209635)
#include <cstdio>
#include <vector>
#include <queue>
#define MX 50001
using namespace std;
FILE *fin, *fout;
struct muc
{
int j,c;
};
vector<muc> v[MX];
int r1[MX], r2[MX], t, n, m, s;
struct comp
{
bool operator() (int a, int b)
{
return r2[a] > r2[b];
}
};
priority_queue<int, vector<int>, comp> q;
void citire()
{
fscanf(fin, "%d%d%d", &n, &m, &s);
int i,x,y,c;
muc e;
for(i=1; i<=n; i++) fscanf(fin, "%d", &r1[i]);
for(i=1; i<=m; i++)
{
fscanf(fin, "%d%d%d", &x, &y, &c);
e.j = y;
e.c = c;
v[x].push_back(e);
e.j = x;
v[y].push_back(e);
}
}
void init()
{
int i;
for(i=1; i<=n; i++) r2[i] = 2000000000;
r2[s] = 0;
}
void dijkstra()
{
q.push(s);
vector<muc>::iterator it;
int u;
muc e;
while(!q.empty())
{
u = q.top();
q.pop();
for(it=v[u].begin(); it!=v[u].end(); it++)
{
e = *it;
if(r2[u] + e.c < r2[e.j])
{
r2[e.j] = r2[u] + e.c;
q.push(e.j);
}
}
}
}
void tipar()
{
int i;
for(i=1; i<=n; i++)
{
if(r1[i] != r2[i])
{
fprintf(fout, "NU\n");
return;
}
}
fprintf(fout, "DA\n");
}
int main()
{
fin = fopen("distante.in", "r");
fout = fopen("distante.out", "w");
int i,j;
fscanf(fin, "%d", &t);
for(i=1; i<=t; i++)
{
citire();
init();
dijkstra();
tipar();
for(j=1; j<=n; j++) v[j].clear();
}
fclose(fin); fclose(fout);
return 0;
}