Cod sursa(job #1096842)

Utilizator gabrielvGabriel Vanca gabrielv Data 2 februarie 2014 17:35:06
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

#define NMAX 50015
#define Gnode first
#define Gcost second

int Dist[NMAX];

vector < pair < int , int > > G[NMAX];

int N,M,S,T;
bool Valid;

void Read()
{
    scanf("%d%d%d",&N,&M,&S);
    for(int i=1;i<S;i++)
        scanf("%d",&Dist[i]);
    scanf("%d",&Dist[S]);
    if(Dist[S])
    {
        Valid = false;
        return;
    }
    for(int i=S+1;i<=N;i++)
        scanf("%d",&Dist[i]);
    for(int i=1,x,y,z;i<=M;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        G[x].push_back(make_pair(y,z));
        G[y].push_back(make_pair(x,z));
    }
}

void CheckDijkstra()
{
    for(int node=2;node<=N && Valid;node++)
    {
        bool foundEdge = false;

        for(vector < pair < int , int > > :: iterator it = G[node].begin(); it != G[node].end(); ++ it )
            if(Dist[(*it).Gnode] + (*it).Gcost < Dist[node])
            {
                Valid = false;
                return;
            }
            else
                if(Dist[(*it).Gnode] + (*it).Gcost == Dist[node])
                    foundEdge = true;

        if(!foundEdge)
            Valid = false;
    }
}

void Print()
{
    if(Valid)
        printf("DA\n");
    else
        printf("NU\n");
}

void Reset()
{
   for(int i=1;i<=N;i++)
        G[i].clear();
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&T);

    while(T--)
    {
        Valid = true;
        Read();
        if(Valid)
            CheckDijkstra();
        Print();
        if(T)
            Reset();
    }
    return 0;
}