Cod sursa(job #611828)

Utilizator 0pt1musOptimus 0pt1mus Data 3 septembrie 2011 18:05:34
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <cstring>

#define distSize 50001
#define useSize 50001
#define lineSize 51

using namespace std;

ifstream IN;
ofstream OUT;

int dist[distSize];
int good;

inline void Read(int &N,int &M,int &Source)
{
    IN>>N>>M>>Source;

    for(int i=1;i<=N;++i)
        IN>>dist[i];

    good=1;
}

inline void Verify(int N,int M,int Source)
{
    char line[lineSize];

    if(dist[Source]!=0)
    {
        good=0;
        for(;M--;) IN>>line;
        return;
    }

    int use[useSize];
    int Count,x,y,c;

    memset(use,0,sizeof(use));

    use[Source]=1;
    Count=1;

    for(;M--;)
    {
        IN>>x>>y>>c;

        if(dist[y]>dist[x]+c)
        {
            good=0;
            for(;M--;) IN>>line;
            return;
        }
        else
        if(dist[y]==dist[x]+c)
        {
            Count+=1-use[y];
            use[y]=1;
        }

        if(dist[x]>dist[y]+c)
        {
            good=0;
            for(;M--;) IN>>line;
            return;
        }
        else
        if(dist[x]==dist[y]+c)
        {
            Count+=1-use[x];
            use[y]=1;
        }
    }

    if(Count!=N) good=0;
}

inline void Write()
{
    if(good) OUT<<"DA\n";
    else OUT<<"NU\n";
}

int main()
{
    int Test,N,M,Source;

    IN.open("distante.in");
    OUT.open("distante.out");

    IN>>Test;

    for(;Test--;)
    {
        Read(N,M,Source);
        Verify(N,M,Source);
        Write();
    }

    IN.close();
    OUT.close();

    return 0;
}