Cod sursa(job #8960)

Utilizator rusRus Sergiu rus Data 25 ianuarie 2007 23:14:24
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 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, tt;
long int ip;
long int d[50001], s[50001], dd[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", &tt );
    for ( i = 1; i <= tt; i++ )
    {
        
        prim = 0;
        scanf ( "%ld %ld %ld", &n, &m, &ip );
        
        for ( j = 1; j <= n; j++ )
            scanf ( "%ld", &d[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++ )
    {
        dd[i] = 2000000000;
        s[i] = 0;
    }

    for ( p = l[ip]; p; p = p->adr_urm )
    {
        dd[p->x] = p->cost;
        add1 ( p->x, p->cost );
        
    }
    dd[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 ( dd[poz] + p->cost < dd[p->x] )
            {
                if ( dd[p->x] == 2000000000 )
                {
                    //add1 ( p->x, dd[poz] + p->cost );
                    dd[p->x] = dd[poz] + p->cost;
                }
                else
                    dd[p->x] = dd[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, dd[i] );
    //printf ( "\n" );

	for ( i = 1; i <= n; i++ )
		if ( d[i] != dd[i] )
            break;

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

}