Pagini recente » Cod sursa (job #788402) | Cod sursa (job #2225605) | Cod sursa (job #1549103) | Cod sursa (job #3250621) | Cod sursa (job #2702189)
#include <iostream>
#include <vector>
#include <fstream>
#include <set>
#include <bitset>
using namespace std;
vector <pair <int, int> > L[50005];
set<pair<int, int> > s;
int dist[50005], ans[50005], n, start;
ifstream fin("distante.in");
ofstream fout("distante.out");
void Read()
{
for (int i = 1; i <= n; i++)
L[i].clear();
int m, g;
fin >> n >> m >> start;
for (int i = 1; i <= n; i++)
fin >> ans[i];
while (m--)
{
int x, y, c;
fin >> x >> y >> c;
L[x].push_back({ y, c });
L[y].push_back({ x, c });
}
}
void Solve()
{
s.insert({ 0, start });
for (int i = 1; i <= n; i++)
dist[i] = 2e9;
dist[start] = 0;
while (!s.empty())
{
int vertex = s.begin() -> second;
int d = s.begin()->first;
s.erase(s.begin());
for (auto it : L[vertex])
{
if (dist[it.first] > d + it.second)
{
if (dist[it.first] != 2e9)
s.erase(s.find({ dist[it.first], it.first }));
dist[it.first] = d + it.second;
s.insert({ dist[it.first], it.first });
}
}
}
for (int i = 1; i <= n; i++)
if (dist[i] != ans[i])
{
fout << "NU\n";
return;
}
fout << "DA\n";
}
int main()
{
int T;
fin >> T;
while (T--)
{
Read();
Solve();
}
fin.close();
fout.close();
}