Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #3348977) | Cod sursa (job #698796) | Cod sursa (job #3310232)
#include <fstream>
#include<bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50000;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
int d[NMAX+5];
vector<pair<int,int>>graph[NMAX+5];
void reset_dijkstra(int n)
{
for(int i=1;i<=n;i++)
{
d[i]=2e9;
}
}
void dijkstra(int StartNode,int nodes)
{
reset_dijkstra(nodes);
pq.push({0,StartNode});
d[StartNode]=0;
while(!pq.empty())
{
auto [dist,CurrNode]=pq.top();
pq.pop();
if(dist>d[CurrNode])continue;
for(auto &[Neighbor,Cost]:graph[CurrNode])
{
if(d[Neighbor]>d[CurrNode]+Cost)
{
d[Neighbor]=d[CurrNode]+Cost;
pq.push({d[CurrNode]+Cost,Neighbor});
}
}
}
}
void edge(int x,int y,int cost)
{
graph[x].push_back({y,cost});
graph[y].push_back({x,cost});
}
void Reset_Graph(int n)
{
for(int i=1;i<=n;i++)
graph[i].clear();
}
int main()
{
int t;
fin>>t;
while(t--)
{
int n,m,StartNode;
fin>>n>>m>>StartNode;
int v[n+1];
for(int i=1;i<=n;i++)
{
fin>>v[i];
}
while(m--)
{int x,y,cost;
fin>>x>>y>>cost;
edge(x,y,cost);
}
bool ok=0;
dijkstra(StartNode,n);
for(int i=1;i<=n;i++)
{
if(v[i]!=d[i]){fout<<"NU\n";ok=1;break;}
}
if(!ok)fout<<"DA"<<"\n";
Reset_Graph(n);
}
return 0;
}