Pagini recente » Cod sursa (job #3150493) | Istoria paginii runda/oji2005_c10 | Cod sursa (job #1921539) | Cod sursa (job #2597564) | Cod sursa (job #2364990)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
using namespace std;
int t,n,m,s,i,j,q[50005],r[50005],a,b,c,x,y,contor,viz[50005],ok;
vector <int> v[50005],d[50005];
set< pair<int,int> > w;
int main()
{
ifstream in("distante.in");
ofstream out("distante.out");
in>>t;
for(j=1;j<=t;j++)
{
in>>n>>m>>s;
for(i=1;i<=n;i++)
viz[i]=0;
for(i=1;i<=n;i++)
in>>q[i];
for(i=1;i<=m;i++)
{
in>>a>>b>>c;
v[a].push_back(b);
d[a].push_back(c);
}
for(i=1;i<=n;i++)
r[i]=1<<30;
r[s]=0;
w.insert(make_pair(0,s));
contor=1;
while(contor>0)
{
x=w.begin()->first;
y=w.begin()->second;
if(viz[y]==1)
{
w.erase(w.begin());
contor--;
}
else
{
for(i=0;i<v[y].size();i++)
{
if(r[y]+d[y][i]<r[v[y][i]])
{
r[v[y][i]]=r[y]+d[y][i];
w.insert(make_pair(r[v[y][i]], v[y][i]));
contor++;
}
}
viz[y]=1;
}
}
ok=0;
for(i=1;i<=n;i++)
{
if(r[i]==1<<30)
r[i]=0;
if(r[i]!=q[i])
ok=1;
}
if(ok==0)
out<<"DA\n";
else
out<<"NU\n";
}
}