Pagini recente » Cod sursa (job #84899) | Cod sursa (job #1807192) | Cod sursa (job #2320321) | Cod sursa (job #2076461) | Cod sursa (job #2884493)
#include <iostream>
#include <fstream>
#include <vector>
#define INF 2147483647
using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");
int T;
vector <int>BRZ;
vector <pair<int,int> >V[50001];
vector <pair<int,int> > H;
int D[50001];
void rebuild()
{
if(H.size()==1)
H.pop_back();
else
{
int last=H.size()-1;
swap(H[last],H[0]);
H.pop_back();
int parent=0;
int G=0;
last--;
while(G==0 && parent<=last)
{
cout<<3<<endl;
int poz=parent;
int child1=parent*2+1;
int child2=parent*2+2;
if(child1<=last)
if(H[child1].second<H[poz].second)
poz=child1;
if(child2<=last)
if(H[child2].second<H[poz].second)
poz=child2;
if(poz==parent)
{
G=1;
continue;
}else
{
swap(H[parent],H[poz]);
parent=poz;
}
}
}
}
void heapify()
{
int child=H.size()-1;
int G=0;
while(child>0 && G==0)
{
int parent=(child-1)/2;
cout<<2<<endl;
if(H[parent].second>H[child].second)
{
swap(H[parent],H[child]);
child=parent;
}else
{
G=1;
continue;
}
}
}
void Dijkstra()
{
while(!H.empty())
{
int vertex=H[0].first;
rebuild();
for(int i=0;i<V[vertex].size();i++)
{
int vecin=V[vertex][i].first;
if(D[vecin]>D[vertex]+V[vertex][i].second)
{
D[vecin]=D[vertex]+V[vertex][i].second;
H.push_back(make_pair(vecin,D[vecin]));
cout<<1<<endl;
heapify();
}
}
}
}
int main()
{
fi>>T;
for(int test=1;test<=T;test++)
{
int n,m,source;
fi>>n>>m>>source;
BRZ.clear();
for(int i=1;i<=n;i++)
{
D[i]=INF;
V[i].clear();
int x;
fi>>x;
BRZ.push_back(x);
}
for(int i=1;i<=m;i++)
{
int nodeX,nodeY,C;
fi>>nodeX>>nodeY>>C;
V[nodeX].push_back(make_pair(nodeY,C));
V[nodeY].push_back(make_pair(nodeX,C));
}
D[source]=0;
H.push_back(make_pair(source,0));
Dijkstra();
int GG=0;
for(int i=1;i<=n && GG==0;i++)
{
if(D[i]!=BRZ[i-1])
{
GG=1;
continue;
}
}
if(!GG)
fo<<"DA"<<"\n";
else
fo<<"NU"<<"\n";
}
return 0;
}