Pagini recente » Cod sursa (job #572468) | Cod sursa (job #2453897) | Cod sursa (job #2638833) | Cod sursa (job #3207751) | Cod sursa (job #1626342)
#include <fstream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std ;
const int MMAX = 100005 ;
const int NMAX = 50005 ;
const int INF = 0x3f3f3f3f ;
ifstream fin("distante.in") ;
ofstream fout("distante.out") ;
int D[NMAX], N, S, M, sol[NMAX];
int T ;
queue <int> Q;
inline void Dijkstra(vector <pair <int, int> > V[NMAX])
{
sol[S] = 0 ;
Q.push(S) ;
while(!Q.empty())
{
int newnode = Q.front();
Q.pop() ;
for(vector <pair <int, int> > ::iterator it = V[newnode].begin(); it != V[newnode].end() ; ++ it)
if(sol[it -> first] > sol[newnode] + it -> second)
{
sol[it -> first] = sol[newnode] + it -> second ;
Q.push(it -> first) ;
}
}
}
int main()
{
fin >> T ;
while(T --)
{
fin >> N >> M >> S ;
vector <pair <int, int> > V[MMAX] ;
memset(D, 0, sizeof D) ;
memset(sol, INF, sizeof sol);
for(int i = 1 ; i <= N ; ++ i)
fin >> D[i] ;
for(int i = 1 ; i <= M ; ++ i)
{
int x, y , cost ;
fin >> x >> y >> cost ;
V[x].push_back(make_pair(y, cost)) ;
V[y].push_back(make_pair(x, cost)) ;
}
Dijkstra(V) ;
bool ok = true ;
for(int i = 1 ; i <= N ; ++ i)
if(D[i]!= sol[i])
{
fout << "NU\n" ;
ok = false ;
break ;
}
if(ok)
fout << "DA\n" ;
}
fin.close() ;
fout.close() ;
return 0 ;
}