Cod sursa(job #976265)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 22 iulie 2013 22:00:58
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<cstdio>
#include<vector>
#define NMAX 50000
#define oo 1<<30
using namespace std;
void read();
int solve();
int T,N,M,S,a,b,c,i;
int D[NMAX];
vector<pair<int,int> > V[NMAX];
vector<pair<int,int> >::iterator it;
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&T);
    for(;T;--T)
    {
        read();
        if(solve()==0) printf("NU\n");
        else printf("DA\n");
    }
    return 0;
}
void read()
{
    scanf("%d%d%d",&N,&M,&S);
    for(i=1;i<=N;i++)
    {
        scanf("%d",&D[i]);
        V[i].resize(0);
    }
    for(;M;--M)
    {
        scanf("%d%d%d",&a,&b,&c);
        V[a].push_back(make_pair(b,c));
        V[b].push_back(make_pair(a,c));
    }
}
int solve()
{
    if(D[S]!=0) {return 0;}
    for(a=1;a<=N;a++)
    {
        if(a!=S) b=0;
        else b=1;
        for(it=V[a].begin();it!=V[a].end();it++)
        {
            if(D[it->first]+it->second<D[a] || D[a]+it->second<D[it->first]) {return 0;}
            if(D[it->first]+it->second==D[a]) b=1;
        }
        if(b==0) {return 0;}
    }
    return 1;
}