Cod sursa(job #1365760)

Utilizator BologaDragosBologa Dragos BologaDragos Data 28 februarie 2015 15:04:08
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#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;
}