Cod sursa(job #1248549)

Utilizator TheFFOFratila Florin Ovidiu TheFFO Data 25 octombrie 2014 14:50:44
Problema Distante Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <cstring>

#define N 50005

using namespace std;

void loop()
{
    int n,m,sursa,i,a,b,c,cost[N],viz[N];
    vector<pair<int,int> > g[N];
    vector<pair<int,int> >::iterator it;
    stack<int> s;
    scanf("%d%d%d",&n,&m,&sursa);
    for(i=1;i<=n;++i)
        scanf("%d",&cost[i]);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        g[a].push_back(make_pair(b,c));
        g[b].push_back(make_pair(a,c));
    }
    memset(viz,0,sizeof(viz));
    viz[sursa]=1;
    for(it=g[sursa].begin();it!=g[sursa].end();++it)
            if(!viz[it->first])
            {
                s.push(it->first);
                viz[it->first]=1;
            }
    while(!s.empty())
    {
        a=s.top();
        s.pop();
        for(it=g[a].begin();it!=g[a].end();++it)
            if(!viz[it->first])
            {
                s.push(it->first);
                viz[it->first]=1;
            }
        int ok=0;
        for(it=g[a].begin();it!=g[a].end();++it)
        {
            if(cost[a]>cost[it->first]+it->second)
            {
                printf("NU\n");
                return;
            }
            else if(cost[a]==cost[it->first]+it->second)
                ok=1;
        }
        if(!ok)
            printf("NU\n");
    }
    printf("DA\n");
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--)
        loop();
    return 0;
}