Cod sursa(job #8959)

Utilizator rusRus Sergiu rus Data 25 ianuarie 2007 23:13:37
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <stdio.h>
#include <iomanip.h>


typedef struct nod
{
    long int x, cost;
    nod *adr_urm;
}*pnod;

pnod l[50001], prim, ultim;

long int m, n, teste;
long int ip;
long int sir[50001], s[50001], dis[50001];


void citire ();
void add ( long int i, long int j, long int k );
void add1 ( long int i, long int j );
void dijkstra ();
void afisare ();


int main ()
{
    freopen ( "distante.in", "r", stdin );
    freopen ( "distante.out", "w", stdout );

    citire ();

    return 0;
}

void citire ()
{
    long int i;
    long int x, y, k, j;

    scanf ( "%ld", &teste );
    for ( i = 1; i <= teste; i++ )
    {
        
        
        scanf ( "%ld %ld %ld", &n, &m, &ip );
        
        for ( j = 1; j <= n; j++ )
            scanf ( "%ld", &sir[j] );
        for ( j = 1; j <= m; j++ )
        {
            scanf ( "%ld %ld %ld", &x, &y, &k );
            add (x, y, k );     
            add (y, x, k );
        }
        dijkstra ();
        afisare ();
    }        
}

void add ( long int i, long int j, long int k )
{
    pnod p = new nod;
    p->x = j;
    p->cost = k;
    p->adr_urm = l[i];
    l[i] = p;
}

void dijkstra ()
{
    long int i, j, k;
    long int poz, ind;
    long int min;
    pnod p;

    for ( i = 1; i <= n; i++ )
    {
        dis[i] = 2000000000;
        s[i] = 0;
    }

    for ( p = l[ip]; p; p = p->adr_urm )
    {
        dis[p->x] = p->cost;
        add1(p->x,p->cost);      
    }
    dis[ip] = 0;
    for ( i = 1; i <= n; i++ )
    {
        //if ( i == ip )
          //  continue;
        min = 2000000000;

        for ( p = prim; p; p = p->adr_urm )
            if ( !s[p->x] && p->cost < min )
            {
                min = p->cost;
                poz = p->x;
            }
        s[poz] = 1;

        for ( p = l[poz]; p; p = p->adr_urm )
            if ( dis[poz] + p->cost < dis[p->x] )
            {
                                    
                    dis[p->x] = dis[poz] + p->cost;
                   
            }
                
                
    }

}         

void add1 ( long int i, long int cost )
{
    pnod p = new nod;
    p->x = i;
    p->cost = cost;
    p->adr_urm = prim;
    prim = p;
}
void afisare ()
{
	long int i;

    //for ( i = 1; i <= n; i++ )
       // printf ( "%ld %ld %ld\n", ip, i, dis[i] );
    //printf ( "\n" );

	for ( i = 1; i <= n; i++ )
		if ( sir[i] != dis[i] )
            break;

    if ( i == n + 1 )
        printf ( "DA\n" );		
    else
        printf ( "NU\n" );

}