Pagini recente » Cod sursa (job #974760) | Cod sursa (job #422732) | Cod sursa (job #658894) | Cod sursa (job #1533247) | Cod sursa (job #1190025)
#include<fstream>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int INFINIT = 999999;
vector<int> v[60000];
vector<int> cost[60000];
int viz[60000],sol[60000],rez[60000],n,m,s;
queue<int> coada;
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 < v[coada.front()].size() ; 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();
}
for(i = 1 ; i <= n ; i++)
if(sol[i] != rez[i]){
out<<"NU\n";
return;
}
out<<"DA\n";
}
int main()
{
int T,i,x,y,c;
in>>T;
for( ; T ; --T)
{
in>>n>>m>>s;
for(i = 1 ; i <= n ; i++){
in>>rez[i];
sol[i] = INFINIT;
viz[i] = 0;
}
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);
}
}