Pagini recente » Cod sursa (job #2213025) | Cod sursa (job #1054312) | Cod sursa (job #2963882) | Cod sursa (job #2214233) | Cod sursa (job #524038)
Cod sursa(job #524038)
#include <fstream>
#include <set>
#include <vector>
#define DIM 50001
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n, t, m, sursa;
vector<pair<int,int> > G[DIM];
int d[DIM], sol[DIM];
vector<bool> s;
void Dijkstra(int S, int d[DIM]);
void Clean();
int main()
{
fin >> t;
for (int p = 1; p <= t; ++p)
{
fin >> n >> m >> sursa;
Clean();
for (int i = 1; i <= n; ++i)
{
fin >> sol[i];
d[i] = INF;
}
int x, y, c;
for (int i = 1; i <= m; ++i)
{
fin >> x >> y >> c;
G[x].push_back(make_pair(c,y));
G[y].push_back(make_pair(c,x));
}
Dijkstra(sursa, d);
bool ok = true;
for (int i = 1; i <= n && ok; ++i)
if (sol[i] != d[i]) ok = false;
if (ok) fout << "DA\n";
else fout << "NU\n";
}
fin.close();
fout.close();
return 0;
}
void Clean()
{
s.clear();
s.resize(n+1);
for (int i = 1; i <= n; ++i) G[i].clear();
}
void Dijkstra(int S, int d[DIM])
{
set<pair<int,int> > Q;
set<pair<int,int> >::iterator it;
for (int i = 1; i <= n; ++i) d[i] = INF;
d[S] = 0;
Q.insert(make_pair(0,S));
int x, val;
while (!Q.empty())
{
it = Q.begin();
val = it->first;
x = it->second;
Q.erase(it);
for (int i = 0; i < G[x].size(); ++i)
{
int son = G[x][i].second;
if ( d[son] > val + G[x][i].first)
{
// s[son] = true;
d[son] = val + G[x][i].first;
Q.insert(make_pair(d[son], son));
}
}
}
}