Cod sursa(job #970475)

Utilizator gbi250Gabriela Moldovan gbi250 Data 6 iulie 2013 21:41:16
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <cstring>
#define SIZE 50001
using namespace std;
struct node{
    int nr, cost;
} a;
int i, j, n, m, x, y, z, t, s, d[SIZE], d2[SIZE];
bool sw;
vector <node> v[SIZE];
queue <int> c;

void sursa_unica(int s)
{
    for(int i=1;i<=n;++i)
        d[i]=INT_MAX;
    d[s]=0;
}

void dijkstra(int n)
{
    c.push(s);
    while(!c.empty())
    {
        x=c.front(); c.pop();
        for(int i=0;i<v[x].size();++i)
            if(d[x]+v[x][i].cost<d[v[x][i].nr])
            {
                d[v[x][i].nr]=d[x]+v[x][i].cost;
                c.push(v[x][i].nr);
            }
    }
}

int main()
{
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);
    scanf("%d", &t);
    for(i=1;i<=t;++i)
    {
        scanf("%d %d %d", &n, &m, &s);
        sursa_unica(s);
        for(j=1;j<=n;++j)
            scanf("%d", &d2[j]);
        for(j=1;j<=m;++j)
        {
            scanf("%d %d %d", &x, &y, &z);
            a.cost=z; a.nr=y;
            v[x].push_back(a);
        }
        dijkstra(n);
        sw=1;
        for(j=1;j<=n&&sw;++j)
            if(d[j]!=d2[j]&&d[j]!=INT_MAX&&d2[j]!=0)
            {
                sw=0;
                break;
            }
        if(!sw)
            printf("NU\n");
        else
            printf("DA\n");
    }
    return 0;
}