Pagini recente » Cod sursa (job #1366850) | Cod sursa (job #2517271) | Cod sursa (job #2714812) | Cod sursa (job #2179064) | Cod sursa (job #2167748)
#include <bits/stdc++.h>
#define N 50010
#define INF 1000000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector<pair<int,int>>muchii[N];
priority_queue<pair<int,int>>Coada;
bitset<N>vizitat;
int Tests,nrNoduri,nrMuchii,Start;
int PreDist[N],EndDist[N];
void Citire()
{
fin>>nrNoduri>>nrMuchii>>Start;
for(int i=1;i<=nrNoduri;i++)
fin>>PreDist[i];
int origine,destinatie,lung;
for(;nrMuchii;nrMuchii--)
fin>>origine>>destinatie>>lung;
muchii[origine].push_back({destinatie,lung});
muchii[destinatie].push_back({origine,lung});
}
void Determinare()
{
for(int i=1;i<=nrNoduri;i++)
EndDist[i]=INF;
EndDist[Start]=0;
Coada.push({0,Start});
while(Coada.size())
{
int CostCurent,NodCurent;
tie(CostCurent,NodCurent)=Coada.top();
Coada.pop();
CostCurent *= -1;
if(vizitat[NodCurent])
continue;
vizitat[NodCurent]=true;
for(auto NodUrm:muchii[NodCurent])
{
if(EndDist[NodUrm.first]>CostCurent+NodUrm.second)
{
EndDist[NodUrm.first]=CostCurent+NodUrm.second;
Coada.push({-EndDist[NodUrm.first],NodUrm.first});
}
}
}
}
void Verificare()
{
bool ok=true;
for(int i=1;i<=nrNoduri;i++)
{
if(PreDist[i]!=EndDist[i])
ok=false;
}
if(ok)
fout<<"DA\n";
else
fout<<"NU\n";
}
void Resetare()
{
for(int i=0;i<=nrNoduri;i++)
muchii[i].clear();
while(Coada.size())
Coada.pop();
vizitat.reset();
memset(PreDist,0,N+1);
memset(EndDist,0,N+1);
}
int main()
{
fin>>Tests;
for(;Tests;Tests--)
{
Citire();
Determinare();
Verificare();
Resetare();
}
return 0;
}