Pagini recente » Cod sursa (job #2254485) | Istoria paginii runda/sim-oji-cls10-24.01 | Cod sursa (job #921382) | Cod sursa (job #385866) | Cod sursa (job #1282780)
#include <fstream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
vector< vector< pair<int,int> > > a;
vector<int> d;
vector<bool> u;
queue<int> q;
int n,m,dd[50001];
bool dijkstra(int x)
{
int k;
d[x]=0;
u[x]=true;
q.push(x);
while(!q.empty())
{
k=q.front();q.pop();
u[k]=false;
for(vector< pair<int,int> >::iterator i=a[k].begin();i!=a[k].end();i++)
if(d[k]+i->second < d[i->first])
{
d[i->first]=d[k]+i->second;
if(u[i->first]==false)
{
q.push(i->first);
u[i->first]=true;
}
}
}
for(int i=2;i<=n;i++)
{
if(d[i]==numeric_limits<int>::max())d[i]=0;
if(d[i]!=dd[i])return false;
}
return true;
}
int main()
{
int x,y,z,j,t,st;
for(cin>>t;t;t--)
{
cin>>n>>m>>st;
a=vector< vector< pair<int,int> > >(n+1);
d=vector<int>(n+1,numeric_limits<int>::max());
u=vector<bool>(n+1);
for(j=1;j<=n;j++)cin>>dd[j];
for(;m;m--)
{
cin>>x>>y>>z;
a[x].push_back(make_pair(y,z));
}
if(dijkstra(st))cout<<"DA"<<'\n';
else cout<<"NU"<<'\n';
}
return 0;
}