Pagini recente » Cod sursa (job #1817472) | Cod sursa (job #3040738) | Cod sursa (job #1362207) | Cod sursa (job #1805709) | Cod sursa (job #1365760)
#include <fstream>
#include <vector>
#define INF 0x3f3f3f3
#define NMAX 50002
using namespace std;
ifstream f("distante.in") ;
ofstream g("distante.out") ;
struct muchie
{
int much ;
int cost ;
};
vector <muchie> v[NMAX] ;
int d[NMAX],h[NMAX],poz[NMAX],OK[NMAX] ;
int S,T,n,m,ct ;
void add(int p) ;
void sterge(int p) ;
void urca(int p) ;
void coboara(int p) ;
void schimba(int px,int py)
{
int aux ;
poz[h[px]]=py ;
poz[h[py]]=px ;
aux=h[px] ;
h[px]=h[py] ;
h[py]=aux ;
}
void coboara(int p)
{
int left,right,aux ;
left=p*2 ;
right=p*2+1 ;
aux=p ;
if(left<=ct&&d[h[left]]<d[h[aux]])
aux=left ;
if(right<=ct&&d[h[right]]<d[h[aux]])
aux=right ;
if(p!=aux)
{
schimba(p,aux) ;
coboara(aux) ;
}
}
void urca(int p)
{
while(p>1&&d[h[p]]<d[h[p/2]])
{
schimba(p,p/2) ;
p/=2 ;
}
}
void add(int nod)
{
ct++ ;
h[ct]=nod ;
poz[nod]=ct ;
urca(ct) ;
}
void sterge(int p)
{
schimba(p,ct) ;
ct-- ;
coboara(p) ;
}
int Dijkstra(int nod)
{
int i,nod2,dist ;
for(i=1;i<=n;i++)
d[i]=INF ;
poz[nod]=1 ;
d[nod]=0 ;
add(nod) ;
while(ct!=0)
{
nod=h[1] ;
sterge(1) ;
for(i=0;i<v[nod].size();i++)
{
nod2=v[nod][i].much ;
dist=v[nod][i].cost ;
if(d[nod]+dist<d[nod2])
{
d[nod2]=d[nod]+dist ;
if(poz[nod2]==0)
add(nod2) ;
else
urca(poz[nod2]) ;
}
}
}
}
void Solve()
{
int i,nod2,nod1,distt ;
f>>T ;
for(int q=1;q<=T;q++)
{
int Solutie=1 ;
f>>n>>m>>S ;
for(i=1;i<=n;i++)
{
f>>OK[i] ;
v[i-1].clear() ;
poz[i]=0 ;
h[i]=0 ;
}
for(i=1;i<=m;i++)
{
f>>nod1>>nod2>>distt ;
v[nod1].push_back((muchie){nod2,distt}) ;
v[nod2].push_back((muchie){nod1,distt}) ;
}
Dijkstra(S) ;
for(i=1;i<=n;i++)
if(d[i]!=OK[i])
{
Solutie=0 ;
break ;
}
if(Solutie==0)
g<<"NU\n" ;
else
g<<"DA\n" ;
}
}
int main()
{
Solve() ;
return 0;
}