Cod sursa(job #1450747)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 14 iunie 2015 16:32:45
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <vector>
using namespace std;
#define mp make_pair
#define pb push_back
#define Nmax 50001

int n, s;

vector< pair<int, int> > G[Nmax];
vector< bool > ok(Nmax);
int d[Nmax];

void read() ;

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

    int i, t;
    bool is_sol;
    vector< pair<int, int> >::iterator it;

    for(scanf("%d", &t); t; --t)
    {
        read();
        
        if(d[s] == 0) ok[s] = 1, is_sol = 1;
        else is_sol = 0;
        
        for(i = 1; i <= n && is_sol; ++i)
            for(it = G[i].begin(); it != G[i].end(); ++it)
                if(d[i] + (it -> second) == d[it -> first]) ok[it -> first] = 1;
                else if(d[i] + (it -> second) < d[it -> first]) is_sol = 0;
        
        if(is_sol) printf("DA\n");
        else printf("NU\n");
        
        for(i = 1; i <= n; ++i) G[i].clear();
        fill(ok.begin(), ok.end(), 0);
    }
    return 0;
}

void read()
{
    int m, a, b, c;

    scanf("%d %d %d", &n, &m, &s);
    for(int i = 1; i <= n; ++i) scanf("%d", d + i);

    for(; m; --m)
    {
        scanf("%d %d %d", &a, &b, &c);
        G[a].pb( mp(b, c) );
        G[b].pb( mp(a, c) );
    }
}