Pagini recente » Cod sursa (job #1358583) | Cod sursa (job #872773) | Cod sursa (job #2113603) | Cod sursa (job #1391253) | Cod sursa (job #2427290)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define nmax 50005
#define INF 10000005
int t,n,m,s,d[nmax],x,y,c,Dist[nmax],nod_crt,vecin,cost;
bool in_coada[nmax];
struct compara
{
bool operator()(int x, int y)
{
return Dist[x]>Dist[y];
}
};
vector < pair<int,int> > v[nmax];
priority_queue <int, vector<int>, compara> coada;
void Dijkstra(int start)
{
for(int i=1;i<=n;i++)
Dist[i]=INF;
Dist[start]=0;
coada.push(start);
in_coada[start]=true;
while(!coada.empty())
{
nod_crt=coada.top();
coada.pop();
in_coada[nod_crt]=false;
for(unsigned i=0;i<v[nod_crt].size();i++)
{
vecin=v[nod_crt][i].first;
cost=v[nod_crt][i].second;
if(Dist[nod_crt]+cost<Dist[vecin])
{
Dist[vecin]=Dist[nod_crt]+cost;
if(in_coada[vecin]==false)
{
coada.push(vecin);
in_coada[vecin]=true;
}
}
}
}
}
int vect[nmax],cd=0,aux,ok=1;
int main()
{
fin>>t;
for(int i=1;i<=t;i++)
{
ok=1;
fin>>n>>m>>s;
for(int j=1;j<=n;j++)
fin>>d[j];
for(int j=1;j<=m;j++)
{
fin>>x>>y>>c;
v[x].push_back(make_pair(y,c));
v[y].push_back(make_pair(x,c));
}
Dijkstra(s);
for(int k=1;k<=n;k++)
{
if(Dist[k]!=d[k])
{
ok=0;
break;
}
}
if(!ok)
fout<<"NU"<<'\n';
else
fout<<"DA"<<'\n';
for(int j=1;j<=n;j++)
{
while(v[j].size()>0)
v[j].pop_back();
}
}
}