Pagini recente » Cod sursa (job #317256) | Cod sursa (job #1571655) | Cod sursa (job #326584) | Cod sursa (job #2222687) | Cod sursa (job #1110155)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector<pair<int,int> > a[50010];
pair<int,int> per,heap[250010];
int nod1,d1,nod2,d2,elheap,ok[50010],sol[50010],con,t,x,y,z,dist[50010],n,m,i,j,s;
void addh(pair<int,int> p)
{
int ch=elheap;
heap[elheap]=p;
while(heap[ch].first<heap[ch/2].first)
{
swap(heap[ch],heap[ch/2]);
ch/=2;
}
}
void delh()
{
int el,ch=elheap;
heap[1]=heap[ch];
z=ch;
ch=1;
if(elheap==1)
heap[1].first=0,heap[1].second=0;
while(heap[ch].first>heap[ch*2].first||heap[ch].first>heap[ch*2+1].first)
{
if(ch*2+1<elheap&&heap[ch*2+1].first<heap[ch*2].first)
z=ch*2+1;
if(ch*2<elheap&&heap[ch*2].first<heap[ch*2+1].first)
z=ch*2;
if(z==ch)
return;
swap(heap[ch],heap[z]);
ch=z;
}
}
int main()
{
f>>t;
heap[0].first=-300000005;
for(con=1;con<=t;con++)
{
f>>n>>m>>s;
for(i=1;i<=n;i++)
{
f>>sol[i];
a[i].erase(a[i].begin(),a[i].end());
ok[i]=0;
dist[i]=300000000;
}
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
a[x].push_back(pair<int,int>(z,y));
a[y].push_back(pair<int,int>(z,x));
}
elheap=1;
dist[s]=0;
heap[1]=pair<int,int>(0,s);
while(elheap)
{
nod1=heap[1].second;
d1=heap[1].first;
delh();
elheap--;
if(!ok[nod1]&&dist[nod1]>=d1)
{
ok[nod1]++;
for(vector<pair<int,int> >::iterator it=a[nod1].begin();it!=a[nod1].end();it++)
{
per=*it;
d2=per.first;
nod2=per.second;
if(dist[nod2]>dist[nod1]+d2)
{
dist[nod2]=dist[nod1]+d2;
elheap++;
addh(pair<int,int>(dist[nod2],nod2));
}
}
}
}
y=0;
for(i=1;i<=n&&!y;i++)
{
if(dist[i]==300000000)
dist[i]=-1;
if(dist[i]!=sol[i]&&i!=s)
{
y=1;
g<<"NU\n";
}
}
if(!y)
g<<"DA\n";
}
return 0;
}