Pagini recente » Cod sursa (job #3267949) | Cod sursa (job #1301580) | Cod sursa (job #1085093) | Cod sursa (job #2417767) | Cod sursa (job #3168450)
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
const int Nmax = 50001, INF = 9999999;
vector<pair<int, int>> mat[Nmax];
queue<int> q;
int n, m, st;
int v[Nmax];
int viz[Nmax];
int vmin[Nmax];
bool Dijkstra(int x)
{
for(int i = 1; i<=n; i++)
v[i] = INF;
v[x] = 0;
q.push(x);
viz[x] = 1;
while(!q.empty())
{
int c = q.front();
q.pop();
for(auto it : mat[c])
{
if(v[it.first] > v[c] + it.second)
{
v[it.first] = v[c] + it.second;
q.push(it.first);
}
}
}
for(int i = 1; i<=n; i++)
viz[i] = 0;
for(int i = 1; i<=n; i++)
{
if(v[i] != vmin[i])
{
return 0;
}
}
return 1;
}
int main()
{
int T;
cin >> T;
for(int i = 0; i<T; i++)
{
cin >> n >> m >> st;
for(int j = 1; j<=n; j++)
cin >> vmin[j];
for(int j = 1; j<=m; j++)
{
int a, b, c;
cin >> a >> b >> c;
mat[a].push_back({b, c});
mat[b].push_back({a, c});
}
if(Dijkstra(st) == 1)
cout << "DA\n";
else
cout << "NU\n";
}
}