Pagini recente » Cod sursa (job #2496749) | Cod sursa (job #2572225) | Cod sursa (job #3222380) | Cod sursa (job #1449863) | Cod sursa (job #1490286)
#include <fstream>
#include <vector>
#include <cstring>
#define Max 1000000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct heapuri
{
int nod,lg;
} heap[100010],tmp;
int n,m,i,y,t,a[50010],dist[50010],x,lg,nod,s;
vector<heapuri> edge[100010];
void AddToHeap(int nod,int lg)
{
int thislg=++heap[0].lg;
int parent=thislg/2;
while(lg<heap[parent].lg && parent>=1)
{
heap[thislg].lg=heap[parent].lg;
heap[thislg].nod=heap[parent].nod;
thislg=parent;
parent=thislg/2;
}
heap[thislg].lg=lg;
heap[thislg].nod=nod;
}
void RemoveFromHeap()
{
heap[0].lg--;
heap[1].lg=heap[heap[0].lg+1].lg;
heap[heap[0].lg+1].lg=Max;
heap[1].nod=heap[heap[0].lg+1].nod;
int thislg=1;
int child=thislg*2;
while((heap[thislg].lg>heap[child].lg || heap[thislg].lg>heap[child+1].lg )&& child<=heap[0].lg)
{
if(heap[child].lg<heap[child+1].lg)
{
tmp.lg=heap[thislg].lg;
tmp.nod=heap[thislg].nod;
heap[thislg].lg=heap[child].lg;
heap[thislg].nod=heap[child].nod;
heap[child]=tmp;
thislg=child;
child=thislg*2;
}
else
{
tmp.lg=heap[thislg].lg;
tmp.nod=heap[thislg].nod;
heap[thislg].lg=heap[child+1].lg;
heap[thislg].nod=heap[child+1].nod;
heap[child+1]=tmp;
thislg=child+1;
child=thislg*2;
}
}
}
bool Dijkstra()
{
AddToHeap(s,0);
while(heap[0].lg)
{
nod=heap[1].nod;
lg=heap[1].lg;
if(dist[nod]==0)
{
dist[nod]=lg;
if(dist[nod]!=a[nod])
return false;
}
for(i=0; i<edge[nod].size(); i++)
if(dist[edge[nod][i].nod]==0 && edge[nod][i].nod!=1)
AddToHeap(edge[nod][i].nod,lg+edge[nod][i].lg);
edge[nod].clear();
RemoveFromHeap();
}
for(i=1; i<=n; i++)
if(dist[i]!=a[i])
return false;
return true;
}
int main()
{
fin>>t;
for(y=1; y<=t; y++)
{
memset(dist,0,sizeof(dist));
fin>>n>>m>>s;
for(i=1; i<=n; i++)
fin>>a[i];
for(i=1; i<=m; i++)
{
fin>>x>>tmp.nod>>tmp.lg;
edge[x].push_back(tmp);
x+=tmp.nod - x + (tmp.nod=x);
edge[x].push_back(tmp);
}
if( Dijkstra())
fout<<"DA"<<'\n';
else
fout<<"NU"<<'\n';
}
return 0;
}