Pagini recente » Cod sursa (job #2662589) | Cod sursa (job #2831650) | Cod sursa (job #1419975) | Cod sursa (job #886444) | Cod sursa (job #563571)
Cod sursa(job #563571)
#include<cstdio>
#include<set>
#include<vector>
#include<cstring>
using namespace std;
const char in[]="distante.in";
const char out[]="distante.out";
const int inf = 1<<30;
const int MaxN = 50100;
#define mp make_pair
#define pb push_back
int K, N, M, S;
int d[MaxN], dc[MaxN];
vector<int> G[MaxN], C[MaxN];
set< pair<int,int> >T;
void solve()
{
int i;
T.insert(mp(0, S));
while(T.size())
{
int val = (*T.begin()).first, x = (*T.begin()).second;
T.erase(*T.begin());
for(i = 0 ; i < G[x].size() ; ++i)
{
if(d[G[x][i]] > d[x] + C[x][i])
d[G[x][i]] = val + C[x][i], T.insert(mp( d[ G[x][i]], G[x][i]));
}
}
}
bool ok()
{
for(int i = 1 ; i <= N ; ++i)
if(d[i] != dc[i])return false;
return true;
}
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &K);
while(K--)
{
scanf("%d%d%d", &N, &M, &S);
for(int i = 1 ; i <= N; ++i)
scanf("%d", &dc[i]), d[i] = inf;
d[1] = 0;
int a, b, c;
for(int i = 1 ; i <= M ; ++i)
scanf("%d%d%d", &a, &b, &c), G[a].pb(b), C[a].pb(c), G[b].pb(a), C[b].pb(c);
solve();
if(ok())printf("DA\n");
else printf("NU\n");
for(int i = 0 ; i <= N ; ++i)
G[i].clear(), C[i].clear();
}
return 0;
}