Pagini recente » Cod sursa (job #354980) | Cod sursa (job #2787359) | Cod sursa (job #1869486) | Cod sursa (job #2695625) | Cod sursa (job #2290375)
#include <fstream>
#include <climits>
#include <vector>
#include <set>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t,n,m,sol[50003],s,dist[50003];
vector<pair<int,int> >g[50003];
multiset<pair<int,int> >heap;
void dijkstra(int x)
{
heap.insert(make_pair(0,x));
while(!heap.empty())
{
int from=heap.begin()->second;
heap.erase(heap.begin());
for(vector<pair<int,int> > :: iterator it=g[from].begin();it!=g[from].end();it++)
{
int to=it->first;
int cost=it->second;
if(dist[to]>dist[from]+cost)
{
if(dist[to]!=INT_MAX)
heap.erase(heap.find(make_pair(dist[to],to)));
dist[to]=dist[from]+cost;
heap.insert(make_pair(dist[to],to));
}
}
}
}
int main()
{
fin>>t;
for(int c=1;c<=t;c++)
{
fin>>n>>m>>s;
for(int i=1;i<=n;i++)
{fin>>sol[i];
dist[i]=INT_MAX;
}
dist[s]=0;
for(int i=1;i<=m;i++)
{
int x,y,a;
fin>>x>>y>>a;
g[x].push_back(make_pair(y,a));
g[y].push_back(make_pair(x,a));
}
dijkstra(s);
dist[s]=0;
int ok=1;
for(int i=1;i<=n;i++)
{
if(dist[i]!=sol[i])
{
ok=0;
break;
}
}
if(ok==0)
fout<<"NU"<<'\n';
else
fout<<"DA"<<'\n';
for(int i=1;i<=n;i++)
g[i].clear();
}
}