Pagini recente » Cod sursa (job #714431) | Cod sursa (job #2387405) | Cod sursa (job #221920) | Cod sursa (job #1339448) | Cod sursa (job #593298)
Cod sursa(job #593298)
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
typedef vector<pair<int, int> > VP;
const int INF = 0x3f3f3f3f;
int T, N, M, X;
int D[50002], Dnow[50002], pos[50002];
VP V[50002];
bool compare(const int& i1, const int& i2)
{
return D[i1] < D[i2];
}
int main()
{
ifstream fin("distante.in");
ofstream fout("distante.out");
fin >> T;
while (T--)
{
fin >> N >> M >> X;
for (int i = 1; i <= N; ++i)
{
fin >> D[i];
pos[i] = i;
Dnow[i] = INF;
}
for (int i = 1, nod1, nod2, cost; i <= M; ++i)
{
fin >> nod1 >> nod2 >> cost;
V[nod1].push_back(make_pair(nod2, cost));
V[nod2].push_back(make_pair(nod1, cost));
}
sort(pos + 1, pos + N + 1, compare);
bool ok = true;
Dnow[X] = 0;
for (int i = 1; i <= N; ++i)
{
if (Dnow[pos[i]] != D[pos[i]]) ok = false;
if (!ok) break;
for (VP::iterator it = V[pos[i]].begin(); it != V[pos[i]].end(); ++it)
if (Dnow[it->first] > Dnow[pos[i]] + it->second)
Dnow[it->first] = Dnow[pos[i]] + it->second;
}
if (!ok) fout << "NU\n";
else fout << "DA\n";
for (int i = 1; i <= N; ++i)
V[i].clear();
}
fin.close();
fout.close();
}