Pagini recente » Cod sursa (job #2191114) | Cod sursa (job #404868) | Cod sursa (job #2921719) | Cod sursa (job #428799) | Cod sursa (job #2488781)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define nmax 50001
#define inf (1<<30)
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
typedef pair< int , int> ipair ;
int n,m,s,nr;
int ok[nmax];
int d[nmax];
void Dijkstra ( int start , vector <int> Ad[] , vector<int> Cost[] )
{
priority_queue < ipair , vector < ipair > , greater <ipair> > pq;
int i,nod,v;
for( i = 1 ; i <= n ; i ++)
d[i] = inf;
d[start]=0;
pq.push( make_pair ( 0 , start) );
while ( !pq.empty() )
{
nod = pq.top().second;
pq.pop();
for( i = 0 ; i < Ad[nod].size() ; i++)
{
v=Ad[nod][i];
if(d[v] > d[nod] + Cost[nod][i])
{
d[v] = d[nod] + Cost [nod][i];
pq.push(make_pair(d[v], v));
}
}
}
}
void rezolva()
{
vector <int> Ad[nmax];
vector <int> Cost[nmax];
int i,c,x,y;
fin>>n>>m>>s;
for( i = 1 ; i <= n ; i++)
fin>>ok[i];
for( i = 1 ; i <= m ; i++)
{fin>>x>>y>>c;
Ad[x].push_back(y);
Cost[x].push_back(c);
Ad[y].push_back(x);
Cost[y].push_back(c);
}
Dijkstra(s,Ad,Cost);
for( i = 1 ; i <= n ; i++)
if( ok[i] != d[i])
{fout<<"NU"<<"\n";
return;
}
fout<<"DA"<<"\n";
}
int main()
{
fin>>nr;
for(int i=1 ; i<=nr ; i++)
{rezolva();
}
return 0;
}