Pagini recente » Cod sursa (job #2662424) | Cod sursa (job #1980365) | Cod sursa (job #1353922) | Borderou de evaluare (job #142893) | Cod sursa (job #2571494)
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 50001
#define INF 1e9
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t,n,m,s,p;
int dist[NMAX];
int h[NMAX],v[NMAX],pos[NMAX];
struct graph {
int n,c;
};
vector <graph> g[11][NMAX];
void change(int p,int q) {
swap(h[p],h[q]);
pos[h[p]]=p;
pos[h[q]]=q;
}
void up(int k) {
while(k>1 && v[h[k]]<v[h[k/2]]) {
change(k,k/2);
k/=2;
}
}
void down(int k) {
int son=0;
int ls=2*k,rs=2*k+1;
if(ls<=n) {
son=ls;
if(rs<=n && v[h[ls]]>v[h[rs]])
son=rs;
if(v[h[son]]>=v[h[k]])
son=0;
}
if(son) {
change(k,son);
down(son);
}
}
void del(int k) {
change(k,n);
n--;
up(k);
down(k);
}
void dijkstra(int node) {
for(int i=0; i<(int)g[p][node].size(); i++) {
graph aux=g[p][node][i];
if(v[aux.n]>v[node]+aux.c) {
v[aux.n]=v[node]+aux.c;
up(pos[aux.n]);
}
}
if(n>0) {
int next=h[1];
del(1);
dijkstra(next);
}
}
int main() {
fin>>t;
for(p=1; p<=t; p++) {
fin>>n>>m>>s;
int nr=n;
for(int i=1; i<=n; i++) {
fin>>dist[i];
v[i]=INF;
h[i]=i;
pos[i]=i;
}
for(int i=1; i<=m; i++) {
int a,b,c;
graph aux;
fin>>a>>b>>c;
aux.c=c;
aux.n=b;
g[p][a].push_back(aux);
aux.n=a;
g[p][b].push_back(aux);
}
v[s]=0;
del(s);
dijkstra(s);
bool ok=1;
n=nr;
for(int i=1;i<=n && ok==1;i++)
if(v[i]!=dist[i])
ok=0;
if(ok==0)
fout<<"NU\n";
else
fout<<"DA\n";
}
return 0;
}