Pagini recente » Cod sursa (job #3137626) | Cod sursa (job #2738335) | Cod sursa (job #3036532) | Cod sursa (job #2367388) | Cod sursa (job #2354237)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#include <limits.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int t,n,m,s,d[50001],dist[50001],i,j,x,y,c;
typedef pair <int,int> TIP;
priority_queue<TIP,vector<TIP>,greater<TIP>> Q;
vector <pair<int,int>> a[50001];
void Dijkstra(int nodstart)
{
Q.push({0,nodstart});
d[nodstart]=0;
while (!Q.empty())
{
int l=Q.top().first;
int nod=Q.top().second;
Q.pop();
if (l!=d[nod])
continue;
for (auto i:a[nod])
{
if (d[nod]+i.second<d[i.first])
{
d[i.first]=d[nod]+i.second;
Q.push({d[i.first],i.first});
}
}
}
}
void infinity()
{
for (int i=1;i<=n;++i)
d[i]=INT_MAX;
}
int main()
{
in>>t;
for (i=1; i<=t; ++i)
{
in>>n>>m>>s;
for (j=1; j<=n; ++j)
in>>dist[j];
for (j=1; j<=m; ++j)
{
in>>x>>y>>c;
a[x].push_back({y,c});
a[y].push_back({x,c});
}
infinity();
Dijkstra(s);
int ok=1;
for (j=1; j<=n; ++j)
{
if (dist[j]!=d[j])
{
ok=0;
out<<"NU\n";
break;
}
}
if (ok)
out<<"DA\n";
if (i<t) memset(a,0,sizeof a);
}
}