Pagini recente » Cod sursa (job #1816951) | Cod sursa (job #2307055) | Rating Marusic Diana (mdiannna) | Cod sursa (job #2740602) | Cod sursa (job #936256)
Cod sursa(job #936256)
#include<fstream>
#include<string.h>
#include<vector>
#define NM 51000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int D[NM],H[NM],P[NM],V[NM],n,i,t,nod,L,m,s,x,y,c;
vector<int> C[NM];
vector<int> N[NM];
void urca(),coboara(),read(),solve(),dele();
int main ()
{
f>>t;
while(t--)
{
read();
dele();
solve();
}
return 0;
}
void urca(int po)
{
while(po&&D[H[po]]<D[H[po>>1]])
{
swap(H[po],H[po>>1]);
swap(P[H[po]],P[H[po>>1]]);
po>>=1;
}
}
void coboara(int po)
{
int po1;
while(po1!=po)
{
po1=po;
if((po1<<1)<=L&&D[H[po1<<1]]<D[H[po]])
po1=po<<1;
if((po<<1)+1<=L&&D[H[(po<<1)+1]]<D[H[po1]])
po1=(po<<1)+1;
swap(H[po],H[po1]);
swap(P[H[po]],P[H[po1]]);
}
}
void dele()
{
int inf=1<<25;
memset(H,0,n);
memset(P,0,n);
for(i=1;i<=n;++i)
D[i]=inf;
}
void read()
{
for(i=1;i<=n;++i)
{
N[i].clear();
C[i].clear();
}
f>>n>>m>>s;
for(i=1;i<=n;++i)
f>>V[i];
for(i=1;i<=m;++i)
{
f>>x>>y>>c;
if(x==y)
continue;
N[x].push_back(y);
C[x].push_back(c);
N[y].push_back(x);
C[y].push_back(c);
}
}
void solve()
{
D[s]=0;
H[1]=s; P[1]=1;
L++;
while(L)
{
nod=H[1];
H[1]=H[L--];
P[H[1]]=1;
coboara(1);
for(i=0;i<C[nod].size();++i)
{
int cos=C[nod][i];
int des=N[nod][i];
if(D[nod]+cos<D[des])
{
D[des]=D[nod]+cos;
if(P[des])
urca(P[des]);
else
{
++L;
H[L]=des;
P[H[L]]=L;
urca(L);
}
}
}
}
for(i=1;i<=n;++i)
{
if(D[i]!=V[i]){
g<<"NU\n"; return; }
}
g<<"DA\n";
}