Pagini recente » Cod sursa (job #1921302) | Cod sursa (job #2960144) | Cod sursa (job #1573371) | Cod sursa (job #1998990) | Cod sursa (job #1515589)
#include <bits/stdc++.h>
using namespace std;
const int MAX = 50005;
const int BMOD = 50;
const int INF = 1e9;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int v[MAX],D[MAX],e = BMOD - 1,n;
char buffer[BMOD+1];
vector < pair < int , int > > G[MAX];
set < pair < int , int > > T;
inline void parsare(int &x){
while(!isdigit(buffer[e])){
e++;
if(e == BMOD)
e = 0,fin.read(buffer,BMOD);
}
x = 0;
while(isdigit(buffer[e])){
x = x * 10 + (buffer[e] - '0');
e++;
if(e == BMOD)
e = 0,fin.read(buffer,BMOD);
}
}
inline void distanta()
{
int cost,nod;
for(int i = 1; i <= n ; i++)
D[i] = INF;
D[(*T.begin()).second] = 0;
while(!T.empty()){
cost = (*T.begin()).first;
nod = (*T.begin()).second;
T.erase(*T.begin());
for(int i = 0 ; i < G[nod].size();i++)
if(D[G[nod][i].second] > D[nod] + G[nod][i].first){
D[G[nod][i].second] = D[nod] + G[nod][i].first;
T.insert({D[G[nod][i].second],G[nod][i].second});
}
}
for(int i = 1; i <= n; i++)
G[i].clear();
}
int main()
{
int s,p,x,y,c,ok,m;
parsare(p);
for(int i = 1; i <= p; i++){
parsare(n); parsare(m); parsare(s);
for(int j = 1; j <= n; j++)
parsare(v[j]);
for(int j = 1; j <= m; j++){
parsare(x); parsare(y); parsare(c);
G[x].push_back({c,y});
G[y].push_back({c,x});
}
T.insert({0,s});
distanta();
ok = 1;
for(int j = 1; j <= n ; j++)
if(D[j] != v[j])
ok = 0,j = n +1;
if(ok == 1)
fout << "DA" << "\n";
else
fout << "NU" << "\n";
}
return 0;
}