Pagini recente » Cod sursa (job #2953301) | Cod sursa (job #1691112) | Cod sursa (job #2419889) | Cod sursa (job #2954353) | Cod sursa (job #1648394)
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
#define Nmax 50010
#define inf 0x3f3f3f3f
queue <int> Q ;
vector <pair<int,int> > ad[Nmax] ;
int D[Nmax] ;
bool viz[Nmax] ;
int n , m , s , start , a , b , c , t ;
int v[Nmax] ;
void Dijkstra ( int start )
{
memset(D, inf, sizeof(D));
memset(viz, 0, sizeof(viz));
D[start] = 0;
viz[start] = true;
queue<int> Q;
Q.push(start);
while (!Q.empty()) {
int nod = Q.front();
Q.pop();
viz[nod] = false;
for (int i = 0; i < ad[nod].size(); ++i)
if (D[nod] + ad[nod][i].second < D[ad[nod][i].first])
{
D[ad[nod][i].first] = D[nod] + ad[nod][i].second;
if ( !viz[ad[nod][i].first] )
{
Q.push(ad[nod][i].first) ;
viz[ad[nod][i].first]=true;
}
}
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for ( int i = 1 ; i <= t ; i++ )
{
scanf("%d %d %d",&n,&m,&s);
for ( int j = 1 ; j <= n ; j++ )
{
scanf("%d ",&v[j]);
}
for ( int q = 1 ; q <= m ; q++ )
{
scanf("%d %d %d",&a,&b,&c);
ad[a].push_back(make_pair(b,c));
ad[b].push_back(make_pair(a,c));
}
Dijkstra(s) ;
bool a_intrat = false ;
for ( int k = 1 ; k <= n ; k++ )
{
if ( D[k] == inf ) D[k] = 0 ;
if ( D[k] != v[k] ) a_intrat = true ;
}
if ( a_intrat == true ) printf("NU\n");
else printf("DA\n");
}
}