Pagini recente » Cod sursa (job #1525029) | Cod sursa (job #2753373) | Cod sursa (job #1097459) | Cod sursa (job #2671849) | Cod sursa (job #1189430)
#include<fstream>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int INFINIT = 99999999;
vector<int> v[50009];
vector<int> cost[50009];
int viz[50009],sol[50009],rez[50009],n,m,s;
queue<int> coada;
void init()
{
for(int i = 1 ; i <= n ; i++)
{
sol[i] = INFINIT;
viz[i] = 0;
}
}
void bmf(int start)
{
int i,k;
coada.push(start);
if(rez[start] != 0){
out<<"NU\n";
return;
}
sol[start] = 0;
viz[start] = 1;
while(!coada.empty()){
viz[coada.front()] = 0;
for(i = 0 ; i < coada.front() ; i++){
k = v[coada.front()][i];
if(sol[coada.front()] < INFINIT){
if(sol[k] > sol[coada.front()] + cost[coada.front()][i]){
sol[k] = sol[coada.front()] + cost[coada.front()][i];
if(sol[k] < rez[k]){
out<<"NU\n";
return;
}
if(viz[k] == 0)
{
viz[k] = 1;
coada.push(k);
}
}
}
}
coada.pop();
}
out<<"DA\n";
}
int main()
{
int T,i,x,y,c;
in>>T;
for( ; T ; --T)
{
init();
in>>n>>m>>s;
for(i = 1 ; i <= n ; i++)
in>>rez[i];
for(i = 1 ; i <= m ; i++)
{
in>>x>>y>>c;
cost[x].push_back(c);
cost[y].push_back(c);
v[x].push_back(y);
v[y].push_back(x);
}
bmf(s);
}
}