Pagini recente » Cod sursa (job #1845673) | Cod sursa (job #81480) | Istoria paginii runda/no_feed2/clasament | Cod sursa (job #1354773) | Cod sursa (job #2227557)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#define oo 0x3f3f3f3f
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int T, n, m, s;
vector<pair<int,int> > G[50001];
queue<int> Q;
vector<int> Dist(50001);
vector<bool> B(50001);
bool BelFord()
{
int nr = 1;
B[s] = 1;
Q.push(s);
while(!Q.empty())
{
int v = Q.front();
for(vector<pair<int,int> > :: iterator it = G[v].begin(); it != G[v].end(); ++it)
{
int v2 = it->first, d = it->second;
if(Dist[v] + d < Dist[v2]) return false;
if(Dist[v] + d > Dist[v2] && !B[v2]) Q.push(v2);
if(Dist[v] + d == Dist[v2] && !B[v2]) {nr++; B[v2] = 1; Q.push(v2);}
}
Q.pop();
}
if(nr == n) return true;
return false;
}
int main()
{
f >> T;
for(int i = 1; i <= T; ++i)
{
f >> n >> m >> s;
for(int j = 1; j <= n; ++j)
f >> Dist[j];
for(int j = 1; j <= m; ++j)
{
int x, y, c;
f >> x >> y >> c;
G[x].push_back(make_pair(y, c));
G[y].push_back(make_pair(x, c));
}
if(BelFord()) g << "DA\n";
else g << "NU\n";
fill(B.begin(), B.end(), 0);
for(int k = 1; k <= n; ++k) G[k].clear();
}
}