Pagini recente » Cod sursa (job #2894330) | Cod sursa (job #1030424) | Cod sursa (job #1872607) | Cod sursa (job #160242) | Cod sursa (job #1479600)
#include <bits/stdc++.h>
#define infinit 1000000000
using namespace std;
vector< pair<int,int> > h[50001];
int n, m, S;
int d[50001], c[50001], viz[50001];
/// returneaza 1 daca distantele minime sunt bune, sau 0 altfel
int Dijkstra()
{
int i, j, k, cost;
queue <int> q;
/// initializari
for (i = 1; i <= n; ++i)
{
c[i] = infinit;
viz[i] = 0;
}
c[S] = 0;
viz[S] = 1;
if (c[S] != d[S]) return 0;
q.push(S);
while (!q.empty())
{
k = q.front();
q.pop();
for (i = 0; i < h[k].size(); i++)
{
j = h[k][i].first;
cost = h[k][i].second;
if (!viz[j] && c[j] > c[k] + cost)
{
c[j] = c[k] + cost;
if (c[j] < d[j]) return 0;
if (c[j] == d[j])
{
viz[j] = 1;
q.push(j);
}
}
}
}
for (i = 1; i <= n; ++i)
if (c[i] != d[i]) return 0;
return 1;
}
void GolesteH()
{
int i;
for (i = 1; i <= n; ++i)
while (!h[i].empty())
h[i].pop_back();
}
void CitireAfisare()
{
int i, T, pas, x, y, cost, rez;
ifstream fin("distante.in");
ofstream fout("distante.out");
fin >> T;
for (pas = 1; pas <= T; ++pas)
{
fin >> n >> m >> S;
GolesteH();
for (i = 1; i <= n; ++i)
fin >> d[i];
for (i = 1; i <= m; ++i)
{
fin >> x >> y>> cost;
h[x].push_back(make_pair(y, cost));
h[y].push_back(make_pair(x, cost));
}
rez = Dijkstra();
if (rez == 1) fout << "DA\n";
else fout << "NU\n";
}
fin.close();
fout.close();
}
int main()
{
CitireAfisare();
return 0;
}