Pagini recente » Cod sursa (job #2663874) | Cod sursa (job #2857440) | Cod sursa (job #2210260) | Cod sursa (job #2323965) | Cod sursa (job #1209647)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#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;
long lsize, poz;
char* buf;
void parsare()
{
fseek(fin, 0, SEEK_END);
lsize = ftell(fin);
rewind(fin);
buf = (char*) malloc(lsize);
fread(buf, 1, lsize, fin);
}
int numar()
{
int nr=0;
while(buf[poz]<'0' || buf[poz]>'9') poz++;
while(buf[poz]>='0' && buf[poz]<='9')
{
nr = nr*10 + buf[poz] - '0';
poz++;
}
return nr;
}
void citire()
{
n = numar();
m = numar();
s = numar();
int i,x,y,c;
muc e;
for(i=1; i<=n; i++)
{
r1[i] = numar();
}
for(i=1; i<=m; i++)
{
x = numar();
y = numar();
c = numar();
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;
parsare();
t = numar();
for(i=1; i<=t; i++)
{
citire();
init();
dijkstra();
tipar();
for(j=1; j<=n; j++) v[j].clear();
}
free(buf);
fclose(fin); fclose(fout);
return 0;
}