Pagini recente » Cod sursa (job #845831) | Atasamentele paginii wow-ce-poate-fi-asa-de-smecher | Cod sursa (job #530007) | Cod sursa (job #2429540) | Cod sursa (job #954294)
Cod sursa(job #954294)
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<algorithm>
#define x first
#define y second
#define NMAX 50007
using namespace std;
vector < pair < int , int > > v[NMAX];
priority_queue< pair < int , int > > q;
int Dist[NMAX] , dist[NMAX];
int N , M , S , a , b , c , T;
bool ap[NMAX];
void dijkstra(int S)
{
q.push(make_pair(0 , S));
memset(ap , 0 , sizeof(ap));
dist[S] = 0;
while(! q.empty())
{
int nod = q.top().y;
if(ap[nod] == false)
{
ap[nod] = true;
for(int i = 0 ; i < v[nod].size() ; ++ i)
{
pair<int , int> val = v[nod][i];
if(dist[nod] + val.y < dist[val.x])
{
dist[val.x] = val.y + dist[nod];
q.push(make_pair(- dist[val.x] , val.x));
}
}
}
q.pop();
}
}
int main()
{
freopen("distante.in" , "r" , stdin);
freopen("distante.out" , "w" , stdout);
scanf("%d" , &T);
for( ; T > 0 ; -- T)
{
scanf("%d %d %d" , &N , &M , &S);
for(int i = 1 ; i <= N ; ++ i)
scanf("%d" , &Dist[i]) , dist[i] = 20000000;
for(int i = 1 ; i <= N ; ++ i)
v[i].clear();
for(int i = 1 ; i <= M ; ++ i)
{
scanf("%d %d %d" , &a , &b , &c);
v[a].push_back(make_pair(b , c));
v[b].push_back(make_pair(a , c));
}
dijkstra(S);
int ok = 0;
///for(int i = 1 ; i <= N ; ++ i)
///printf("%d " , dist[i]);
for(int i = 1 ; i <= N ; ++ i)
if(Dist[i] != dist[i])
ok = 1;
if(ok == 0)
printf("DA\n");
else
printf("NU\n");
}
}