Cod sursa(job #1757829)

Utilizator mariakKapros Maria mariak Data 15 septembrie 2016 22:06:41
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>
#define pb(x) push_back(x)
#define mp make_pair
#define pii pair< int , int >
#define f first
#define s second
#define Nmax 50002

FILE *fin  = freopen("distante.in", "r", stdin);
FILE *fout = freopen("distante.out", "w", stdout);

using namespace std;
int T, n, m, s, d[Nmax];
vector <pii> G[Nmax];
bitset <Nmax> b;
void initial()
{
    b.reset();
    for(int i = 1; i <= n; ++ i)
        G[i].clear();
}
void read()
{
    int x, y, c;
    scanf("%d %d %d", &n, &m, &s);
    for(int i = 1; i <= n; ++ i)
        scanf("%d", &d[i]);
    while(m --)
    {
        scanf("%d %d %d", &x, &y, &c);
        G[x].pb(mp(y, c));
        G[y].pb(mp(x, c));
    }
}
bool solve()
{
    if(d[s] != 0) return 0;
    b.set(s);
    for(int i = 1; i <= n; ++ i)
    {
        for(int j = 0; j < G[i].size(); ++ j)
        {
            if(d[i] > d[G[i][j].f] + G[i][j].s)
                return 0;
            if(d[i] == d[G[i][j].f] + G[i][j].s)
                b.set(i);
        }
        if(!b.test(i)) return 0;
    }
}
int main()
{
    scanf("%d", &T);
    while(T --)
    {
        initial();
        read();
        if(solve())
            printf("DA\n");
        else printf("NU\n");
    }
    return 0;
}