Pagini recente » Cod sursa (job #1778641) | Cod sursa (job #405806) | Cod sursa (job #1345565) | Cod sursa (job #2249817) | Cod sursa (job #2167791)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int N=1e5+5;
const int INF=1<<30;
vector<pair<int,int>>muchii[N];
priority_queue<pair<int,int>>Coada;
bool vizitat[N];
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(int i=1; i<=nrMuchii; i++)
{
fin>>origine>>destinatie>>lung;
muchii[origine].push_back(make_pair(destinatie,lung));
muchii[destinatie].push_back(make_pair(origine,lung));
}
}
void Determinare()
{
for(int i=1; i<=nrNoduri; i++)
EndDist[i]=INF;
EndDist[Start]=0;
Coada.push({0,Start});
int CostCurent,NodCurent;
while(Coada.size())
{
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++)
{
//cout<<EndDist[i]<<' ';
if(PreDist[i]!=EndDist[i])
ok=false;
}
//cout<<'\n';
if(ok)
fout<<"DA\n";
else
fout<<"NU\n";
}
void Resetare()
{
for(int i=0; i<=nrNoduri; i++)
{
muchii[i].clear();
vizitat[i]=false;
}
while(Coada.size())
Coada.pop();
memset(PreDist,0,N+1);
memset(EndDist,0,N+1);
}
int main()
{
fin>>Tests;
for(; Tests; Tests--)
{
Citire();
Determinare();
Verificare();
Resetare();
}
return 0;
}