Pagini recente » Cod sursa (job #1090708) | Cod sursa (job #1806245) | Cod sursa (job #3160080) | Cod sursa (job #848282) | Cod sursa (job #1589137)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#define INF 99999999
#define NMAX 50002
using namespace std;
struct punct
{
int nod,cost;
}p,v;
struct comp{
bool operator () (punct a, punct b)
{
if(a.cost < b.cost)
return true;
return false;
}
};
ifstream in("distante.in");
ofstream out("distante.out");
vector<punct> a[NMAX];
set<punct,comp> T;
int n,m,x,y,s,c,t,d[NMAX],ds[NMAX];
bool dijkstra()
{
d[s] = 0;
p.nod = s;
p.cost = 0;
T.insert(p);
while(!T.empty())
{
p = (*T.begin());
T.erase(T.begin());
// cout << p.nod<< " ";
for(int i=0;i<a[p.nod].size();i++)
{
if(d[a[p.nod][i].nod]> p.cost + a[p.nod][i].cost)
{
d[a[p.nod][i].nod] = p.cost + a[p.nod][i].cost;
v.nod = a[p.nod][i].nod;
v.cost=d[a[p.nod][i].nod];
T.insert(v);
}
}
}
for(int i=1;i<=n;i++)
if(d[i]!=ds[i])
return false;
return true;
}
int main()
{
in >> t;
for(int k=0;k<t;k++)
{
in >> n >> m >> s;
for(int i=1;i<=n;i++)
{
in >> ds[i];
a[i].clear();
d[i] = INF;
}
for(int i=1;i<=m;i++)
{
in >> x >> y >> c;
p.cost = c;
p.nod = y;
a[x].push_back(p);
p.nod = x;
a[y].push_back(p);
}
if(dijkstra())
out << "DA" << "\n";
else out << "NU" << "\n";
}
// for(int i=1;i<=n;i++)
// cout << d[i] << " ";
return 0;
}