Pagini recente » Cod sursa (job #1298749) | Cod sursa (job #3041794) | Cod sursa (job #415060) | Cod sursa (job #253552) | Cod sursa (job #2194784)
#include <iostream>
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>
#define NMAX 50001
#define inf 20000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int T;
struct punct
{
int y,c;
};
vector < punct > G[NMAX];
int N,M,r,dist[NMAX],d[NMAX],inque[NMAX];
struct compara
{
bool operator()( int x, int y)
{
return d[x] > d[y];
}
};
void dijkstra(int node)
{
int k,lg;
priority_queue<int, vector<int>,compara>q;
for(int i =1 ; i <= N; i ++)
dist[i]=inf;
dist[node]=0;
q.push(node);
inque[node]=1;
while(!q.empty())
{
k=q.top();
q.pop();
inque[k]=0;
for(int i = 0 ; i < G[k].size(); i++)
{
int y=G[k][i].y;
int c=G[k][i].c;
lg=dist[k]+c;
if(lg<dist[y])
{
dist[y]=lg;
if(inque[y]==0)
{
q.push(y);
inque[y]=1;
}
}
}
}
}
int main()
{
fin>>T;
while(T--)
{
fin>>N>>M>>r;
for(int i =1 ; i <= N; i++)
fin>>d[i];
for(int i = 1; i <= M; i++)
{
int x,y,c;
punct u;
fin>>x>>u.y>>u.c;
G[x].push_back(u);
}
dijkstra(r);
int ok=1;
for(int j = 1; j <= N; j ++)
if(dist[j]!=d[j])
{
ok=0;
break;
}
if(!ok) fout<<"NU"<<'\n';
else fout<<"DA"<<'\n';
for(int l=1; l <= N; l++)
{
G[l].clear();
}
}
return 0;
}