Pagini recente » Cod sursa (job #2529595) | Cod sursa (job #2749386) | Cod sursa (job #1642245) | Cod sursa (job #1512873) | Cod sursa (job #2465214)
#include<bits/stdc++.h>
#define maxn 50005
#define INF 1 << 30
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int T,n,m,s;
int D[maxn],rsp[maxn];
int nod,cost;
bool OK;
vector <pair <int,int> > lista[maxn];
set <pair<int,int> > heap;
int main()
{
fin>>T;
while( T-- >0 )
{
OK=false;
fin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
fin>>rsp[i];
D[i]=INF;
}
D[s]=0;
for(int i=1;i<=m;i++)
{
int a,b,c;
fin>>a>>b>>c;
lista[a].push_back({b,c});
lista[b].push_back({a,c});
}
for(int i=0;i<lista[s].size();i++)
{
nod=lista[s][i].first;
cost=lista[s][i].second;
D[nod]=cost;
heap.insert({cost,nod});
}
while(!heap.empty())
{
int cos=heap.begin()->first;
int nod=heap.begin()->second;
heap.erase(heap.begin());
for(int i=0;i<lista[nod].size();i++)
{
int vecin=lista[nod][i].first;
int cost_=lista[nod][i].second;
if(D[vecin]>D[nod]+cost_)
{
D[vecin]=D[nod]+cost_;
heap.insert({D[vecin],vecin});
}
}
}
for(int i=1;i<=n;i++)
if(D[i]!=rsp[i])
{
OK=1;
break;
}
if(OK)
fout<<"NU\n";
else
fout<<"DA\n";
heap.clear();
for(int i=1;i<=n;i++)
lista[i].clear();
}
return 0;
}