Pagini recente » Cod sursa (job #2406258) | Cod sursa (job #1931954) | Cod sursa (job #101821) | Cod sursa (job #1519968) | Cod sursa (job #1336563)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define MAX_N 50001
#define MAX_M 100001
#define INF 1<<30
int t, n, m,s,k;
int distBr[MAX_N];
int dist[MAX_N], h[MAX_N], poz[MAX_N];
ifstream f("distante.in");
ofstream g("distante.out");
vector<pair<int, int>> el[MAX_N];
int Q[MAX_N];
bool InQueue[MAX_N];
void readData()
{
int a, b, c;
f >> n >> m >> s;
for (int i = 1; i <= n; ++i)
{
f >> distBr[i];
InQueue[i] = false;
}
for (int i = 1; i <= m; i++)
{
f >> a >> b >> c;
el[a].push_back(make_pair(b,c));
el[b].push_back(make_pair(a, c));
}
}
void compute()
{
int p, u,i;
bool ok = true;
for (i = 1; i <= n; i++)
{
dist[i] = INF;
}
p = u = 1;
Q[u] = s;
dist[s] = 0;
InQueue[Q[u]] = true;
while (p <= u && ok)
{
for (vector<pair<int, int>>::iterator it = el[Q[p]].begin(); it != el[Q[p]].end(); it++)
{
if (dist[it->first] > dist[Q[p]] + it->second)
{
dist[it->first] = dist[Q[p]] + it->second;
if (dist[it->first] < distBr[it->first]) ok = false;
if (!InQueue[it->first])
{
InQueue[it->first] = true;
Q[++u] = it->first;
}
}
}
InQueue[Q[p]] = false;
++p;
}
if (!ok) g << "NU\n";
else
{
for (i = 1; i <= n; i++) if (dist[i] != distBr[i]) break;
if (i <= n) g << "NU\n";
else g << "DA\n";
}
}
int main()
{
int i;
f >> t;
for (i = 1; i <= t; ++i)
{
readData();
compute();
}
f.close();
g.close();
return 0;
}