Pagini recente » Cod sursa (job #21914) | Cod sursa (job #2753429) | Cod sursa (job #2305770) | Cod sursa (job #1054949) | Cod sursa (job #1490279)
#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;
}
}
}
int main()
{
fin>>t;
for(y=1;y<=t;y++)
{
memset(heap,0,sizeof(heap));
memset(dist,0,sizeof(dist));
memset(edge,0,sizeof(edge));
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);
}
AddToHeap(1,0);
while(heap[0].lg)
{
nod=heap[1].nod;
lg=heap[1].lg;
if(dist[nod]==0)
dist[nod]=lg;
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);
RemoveFromHeap();
}
for(i=1;i<=n;i++)
if(dist[i]!=a[i])
break;
if(i==n+1)
fout<<"DA"<<'\n';
else
fout<<"NU"<<'\n';
}
return 0;
}