Cod sursa(job #2103608)

Utilizator calin1Serban Calin calin1 Data 10 ianuarie 2018 15:37:37
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define N 100000
#define inf 0x3f3f3f3f

using namespace std;

int n, m, s;

int d_init[N], d[N], costuri[N];

vector <pair <int, int> > G[N];

vector <pair <int, int> >::iterator it;

queue <int> q;

void clean()
{
    for(int i = 0 ; i <= n ; ++i)
    {
        G[i].clear();

        d[i] = inf;

        d_init[i] = inf;
    }

    for(int i = 0 ; i <= m ; ++i)
    {
        costuri[i] = 0;
    }
}

void verify()
{
    for(int i = 0 ; i < n ; ++i)
    {
        if(d_init[i] != d[i])
        {
            printf("NU\n");

            return;
        }
    }

    printf("DA\n");
}

void solve()
{
    while(!q.empty())
    {
        q.pop();
    }

    q.push(s);

    int x, tmp;

    d[s] = 0;

    while(!q.empty())
    {
        x = q.front();

        q.pop();

        for(it = G[x].begin() ; it != G[x].end() ; ++it)
        {
            tmp = d[x] + it->first;

            if(tmp < d[it->second])
            {
                d[it->second] = tmp;

                q.push(it->second);
            }
        }
    }

    verify();
}

void citire()
{
    int nr;

    int x, y, c;

    scanf("%d\n", &nr);

    for(int i = 0 ; i < nr ; ++i)
    {
        scanf("%d %d %d\n", &n, &m, &s);

        clean();

        for(int j = 1 ; j <= n ; ++j)
        {
            scanf("%d ", &d_init[j]);
        }

        for(int j = 0 ; j < m ; ++j)
        {
            scanf("%d %d %d\n", &x, &y, &c);

            G[x].push_back(make_pair(c,y));
            G[y].push_back(make_pair(c,x));
        }

        solve();
    }
}

int main()
{
    freopen("distante.in", "r", stdin);
    //freopen("distante.out", "w", stdout);

    citire();

    return 0;
}