Cod sursa(job #482638)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 4 septembrie 2010 11:46:29
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;

int viz[50006];
int n,m,s,t;
int d[50006];
vector <int> v[50006];
vector <int> cost[50006];

void curatare()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        j=v[i].size();
        while(j)
        {
            v[i].pop_back();
            cost[i].pop_back();
            j--;
        }
    }
}

int check()
{
    int i,j,lim,vec;
    memset(viz,0,sizeof(viz));
    viz[s]=1;
    for(i=1;i<=n;i++)
    {
        lim=v[i].size();
        for(j=0;j<lim;j++)
        {
            vec=v[i][j];
            if(d[i]+cost[i][j]<d[vec])
                return 0;
            if(d[i]+cost[i][j]==d[vec])
                viz[vec]=1;
        }
    }
    for(i=1;i<=n;i++)
        if(!viz[i])
            return 0;
    return 1;
}

int main ()
{
    int i,a,b,c;
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&t);
    for(;t;t--)
    {
        scanf("%d%d%d",&n,&m,&s);
        for(i=1;i<=n;i++)
            scanf("%d",&d[i]);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            v[a].push_back(b);
            cost[a].push_back(c);
            v[b].push_back(a);
            cost[b].push_back(c);
        }
        if(!d[s] && check())
            printf("DA\n");
        else
            printf("NU\n");
        curatare();
    }
    return 0;
}