Pagini recente » Cod sursa (job #1602257) | Cod sursa (job #3133156) | Cod sursa (job #21957) | Cod sursa (job #229253) | Cod sursa (job #2190061)
#include <fstream>
#include <vector>
#include <set>
#include <cstring>
#define INF 0x3f3f3f3f
#define Nmax 50005
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
void dijk()
{
int n, m, s, dist_calc[Nmax], dist[Nmax];
set <pair <int, int > > dij;
vector <pair <int,int> > v[Nmax];
f >> n >> m >> s;
for ( int i = 1 ; i <= n ; i ++ )
f >> dist_calc[i];
for (;m;m--)
{int i,j,c;
f >> i >> j >> c;
v[i].push_back(make_pair(c,j));
v[j].push_back(make_pair(c,i));
}
memset(dist,INF,sizeof(dist));
dist[s]=0;
dij.insert(make_pair(0,s));
while(!dij.empty())
{
int old_cost = dij.begin()->first;
int old_nod= dij.begin()->second;
dij.erase(dij.begin());
for ( int k = 0 ; k < v[old_nod].size(); k ++ )
{
int new_cost = v[old_nod][k].first;
int new_nod = v[old_nod][k].second;
if(dist[new_nod]>old_cost+new_cost)
{
if(dist[new_nod]!=INF)
dij.erase(dij.find(make_pair(dist[new_nod],new_nod)));
dist[new_nod]=old_cost+new_cost;
dij.insert(make_pair(dist[new_nod],new_nod));
}
}
}
bool ok=false;
for ( int i = 1 ; i <= n && ok == false ; i ++ )
if(dist_calc[i]!=dist[i])
ok=true;
if(ok == true )
g << "NU\n";
else
g << "DA\n";
}
int main()
{
int t;
f >> t;
while ( t -- )
{
dijk();
}
return 0;
}