Cod sursa(job #2145496)

Utilizator PescaruVictorPescaru Victor PescaruVictor Data 27 februarie 2018 13:31:22
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

struct nod {

    int vec, c;
    struct nod* urm;
};

typedef struct nod* LSI;

int n, m, s, t;
int d[50010];
LSI l[50010];

void citire();
void init(int n);
void inserare(LSI& L,int x, int y, nod* p);
void rez();

int main()
{
    citire();
    return 0;
}


void citire()
{
    int i, j, a, b, cs;
    fin>>t;
    for(i=1; i<=t; ++i)
    {


        fin>>n>>m>>s;

        init(n);

        for(j=1; j<=n; ++j)
        {
            fin>>d[j];
        }
        for(j=1; j<=m; ++j)
        {
            fin>>a>>b>>cs;
            inserare(l[a], b, cs, NULL);
            inserare(l[b], a, cs, NULL);
        }

        rez();
    }
}

void init(int n)
{
    int i;
    for(i=1; i<=n; ++i)
        l[i]=NULL;
}

void inserare(LSI& L,int x, int y, nod* p) {

    nod* q;
    q = new nod;

    q->vec = x;
    q->c = y;

    if (p == NULL) {
        q->urm = L;
        L = q;
    }
    else
    {
        q -> urm = p->urm;
        p -> urm = q;
    }

}

void rez()
{
    if(d[s] != 0)
    {
        fout<<"NU\n";
        return;
    }

    int i;
    nod *j;
    bool inter;

    for(i=1; i<=n; ++i)
        if(i != s)
        {
            inter=false;
            for(j=l[i]; j!=NULL; j=j->urm)
                if(d[i] > d[j->vec] + j->c )
                    break;
                else if(d[i] == d[j->vec] + j->c )
                    inter = true;

            if(!inter || j)
            {
                    fout<<"NU\n";
                    return;
            }
        }
    fout<<"DA\n";
}