Pagini recente » Cod sursa (job #941817) | Cod sursa (job #2625318) | Cod sursa (job #2293329) | Cod sursa (job #2674633) | Cod sursa (job #2311213)
#include <bits/stdc++.h>
#define Dim 50004
#define MAX 2000000009
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
typedef pair<int,int> pi;
int N,M,S,T,t,D[Dim],a,b,c;
int Cost[Dim];
bool viz[Dim];
vector <pi> V[Dim];
struct cmp
{
bool operator() (int x,int y)
{
return (Cost[x]>Cost[y]);
}
};
priority_queue < int,vector<int>,cmp > minheap;
void Dijkstra()
{
for(int i=1;i<=Dim-4;i++)
{
Cost[i]=MAX;
viz[i]=0;
}
Cost[S]=0;
minheap.push(S);
viz[S]=1;
while(!minheap.empty())
{
int nod=minheap.top();
minheap.pop();
viz[nod]=1;
for(unsigned int i=0;i<V[nod].size();i++)
{
int vecin=V[nod][i].first;
int pay=V[nod][i].second;
if(Cost[nod]+pay<Cost[vecin])
{
Cost[vecin]=Cost[nod]+pay;
if(viz[vecin]==0)
{
minheap.push(vecin);
viz[vecin]=1;
}
}
}
}
}
int main()
{
f>>T;
for(t=1;t<=T;t++)
{
f>>N>>M>>S;
for(int i=1;i<=N;i++)
{
f>>D[i];
V[i].clear();
}
for(int i=1;i<=M;i++)
{
f>>a>>b>>c;
V[a].push_back({b,c});
V[b].push_back({a,c});
}
Dijkstra();
bool ok=1;
for(int i=1;i<=N&&ok==1;i++)
if(Cost[i]!=D[i]) ok=0;
if(ok) g<<"DA"<<'\n';
else g<<"NU"<<'\n';
}
return 0;
}