Pagini recente » Cod sursa (job #250763) | Cod sursa (job #2259887) | Cod sursa (job #522323) | Cod sursa (job #57326) | Cod sursa (job #2347525)
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int MAX=50007;
int t,n,m,s,x,y,c,dist[MAX],d[MAX],a,b,cost;
bool sel[MAX];
const int INF=2e5;
vector<pair<int ,int > >graf[MAX];
priority_queue<pair<int, int > >h;
void dijkstra(int start)
{
for(int i=1;i<=n;i++)
{
d[i]=INF;
sel[i]=false;
}
d[start]=0;
h.push(make_pair(-d[start],start));
while(!h.empty())
{
while(!h.empty() && sel[h.top().second]) h.pop();
if(h.empty()) return;
x=h.top().second;
h.pop();
sel[x]=true;
for(int i=0;i<graf[x].size();i++)
{
pair<int , int >p=graf[x][i];
y=p.second;
c=p.first;
if(d[x]+c<d[y])
{
d[y]=d[x]+c;
h.push(make_pair(-d[y],y));
}
}
}
}
int main()
{
in>>t;
for(int i=1;i<=t;i++)
{
in>>n>>m>>s;
for(int j=1;j<=n;j++) in>>dist[j];
for(int j=1;j<=m;j++)
{
in>>a>>b>>cost;
graf[a].push_back(make_pair(cost,b));
}
dijkstra(s);
int ok=0;
//for(int j=1;j<=n;j++) out<<d[j]<<" "<<dist[j]<<'\n';
for(int j=1;j<=n;j++)
{
if(dist[j]!=d[j])
{
ok=1;
break;
}
}
if(ok==0)out<<"DA\n";
else out<<"NU\n";
for(int j=1;j<=n;j++) graf[j].clear();
}
return 0;
}