Pagini recente » Borderou de evaluare (job #2089441) | Cod sursa (job #400173) | Borderou de evaluare (job #2179959) | Cod sursa (job #3277904) | Cod sursa (job #485661)
Cod sursa(job #485661)
#include<fstream>
#include<list>
#include<vector>
#define lg (heap.size()-1)
#define NMAX 50005
using namespace std;
long T,n,m,s;
long ok=1;
long distanta[NMAX],vizitat[NMAX];
long long dist[NMAX];
//
//struct nod
//{
// long vf;
// long cost;
// nod(long nvf,long ncost)
// {
// vf=nvf;
// cost=ncost;
// }
//};
vector<list<pair<long,long> > > G;
vector<long> heap;
long pozInHeap[NMAX];
long fiuS(long vf)
{
return 2*vf;
}
long fiuD(long vf)
{
return 2*vf+1;
}
void swap(long poz1, long poz2)
{
long aux;
aux=heap[poz1];
heap[poz1]=heap[poz2];
heap[poz2]=aux;
aux=pozInHeap[heap[poz1]];
pozInHeap[heap[poz1]]=pozInHeap[heap[poz2]];
pozInHeap[heap[poz2]]=aux;
}
void moveUp(long poz)
{
long parinte=poz/2;
while(parinte>=1)
{
if(dist[heap[parinte]]>dist[heap[poz]])
swap(parinte,poz);
else
break;
poz=parinte;
parinte=parinte/2;
}
}
void moveDown(long poz)
{
long fius,fiud;
long pozMin;
do
{
fius=poz*2;
fiud=poz*2+1;
if(fius>lg)
break;
if(fiud>lg || dist[heap[fius]]<dist[heap[fiud]])
pozMin=fius;
else
pozMin=fiud;
if(dist[heap[poz]]>dist[heap[pozMin]])
swap(poz,pozMin);
else
break;
poz=pozMin;
}while(1);
}
void dijkstra()
{
list<pair<long,long> >::iterator itr;
pair<long,long> que;
long el;
dist[s]=0;
moveUp(s);
while(heap.size()!=1)
{
el=heap[1];
pozInHeap[heap[1]]=-1;
pozInHeap[heap[lg]]=1;
heap[1]=heap[lg];
heap.pop_back();
moveDown(1);
if(dist[el]!=distanta[el])
{
ok=0;
break;
}
for(itr=G[el].begin();itr!=G[el].end(); itr++)
{
que=*itr;
if(dist[que.first]>dist[el]+que.second)
{
dist[que.first]=dist[el]+que.second;
moveUp(pozInHeap[que.first]);
}
}
}
}
int main()
{
fstream fin,fout;
long contT,i,x,y,c;
list<pair<long, long> > lista;
G.push_back(lista);
fin.open("distante.in",ios::in);
fout.open("distante.out",ios::out);
fin>>T;
for(contT = 0; contT < T; contT++)
{
fin>>n>>m>>s;
ok=1;
heap.push_back(0);
G.push_back(lista);
for(i=1;i<=n;i++)
{
fin>>distanta[i];
G.push_back(lista);
dist[i]=LONG_MAX;
vizitat[i]=0;
heap.push_back(i);
pozInHeap[i]=i;
}
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
G[x].push_back(make_pair(y,c));
G[y].push_back(make_pair(x,c));
}
dijkstra();
if(ok==1)
fout<<"DA\n";
else
fout<<"NU\n";
heap.clear();
//for(i=0;i<=n;i++)
// G.pop_back();
G.clear();
}
fin.close();
fout.close();
return 0;
}