Pagini recente » Cod sursa (job #114775) | Cod sursa (job #1896650) | Cod sursa (job #1671479) | Cod sursa (job #355131) | Cod sursa (job #2103608)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define N 100000
#define inf 0x3f3f3f3f
using namespace std;
int n, m, s;
int d_init[N], d[N], costuri[N];
vector <pair <int, int> > G[N];
vector <pair <int, int> >::iterator it;
queue <int> q;
void clean()
{
for(int i = 0 ; i <= n ; ++i)
{
G[i].clear();
d[i] = inf;
d_init[i] = inf;
}
for(int i = 0 ; i <= m ; ++i)
{
costuri[i] = 0;
}
}
void verify()
{
for(int i = 0 ; i < n ; ++i)
{
if(d_init[i] != d[i])
{
printf("NU\n");
return;
}
}
printf("DA\n");
}
void solve()
{
while(!q.empty())
{
q.pop();
}
q.push(s);
int x, tmp;
d[s] = 0;
while(!q.empty())
{
x = q.front();
q.pop();
for(it = G[x].begin() ; it != G[x].end() ; ++it)
{
tmp = d[x] + it->first;
if(tmp < d[it->second])
{
d[it->second] = tmp;
q.push(it->second);
}
}
}
verify();
}
void citire()
{
int nr;
int x, y, c;
scanf("%d\n", &nr);
for(int i = 0 ; i < nr ; ++i)
{
scanf("%d %d %d\n", &n, &m, &s);
clean();
for(int j = 1 ; j <= n ; ++j)
{
scanf("%d ", &d_init[j]);
}
for(int j = 0 ; j < m ; ++j)
{
scanf("%d %d %d\n", &x, &y, &c);
G[x].push_back(make_pair(c,y));
G[y].push_back(make_pair(c,x));
}
solve();
}
}
int main()
{
freopen("distante.in", "r", stdin);
//freopen("distante.out", "w", stdout);
citire();
return 0;
}