Cod sursa(job #1631444)

Utilizator alexb97Alexandru Buhai alexb97 Data 5 martie 2016 16:07:31
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
#define NMAX 50005
#define MMAX 100005
using namespace std;

ifstream is("distante.in");
ofstream os("distante.out");


int n, t, m, s;
queue <int> Q;
int d[50005], verif[50005];


void Dijkstra(vector <pair<int, int> > v[MMAX]);

int main()
{
    is >> t;
    bool ok = true;
    int x, y, z;
    for(int i = 1; i <= t; ++i)
    {
        is >> n >> m >> s;

        vector < pair<int, int> > g[MMAX];
        memset(d, INF, sizeof d);
        memset(verif, 0, sizeof verif);
        bool ok = true;
        for(int j = 1; j <= n; ++j)
        {
            is >> verif[j];
        }


        for(int j = 1; j <= m;++j)
        {
            is >> x >> y >> z;
            g[x].push_back({y, z});
            g[y].push_back({x, z});

        }
        Dijkstra(g);

        for(int j = 1; j <= n; ++j)
        {
            if(d[j] != verif[j])
            {
                ok = false;
            }
        }
        if(ok)
            os << "DA" << '\n';
        else
            os << "NU" << '\n';
    }

    is.close();
    os.close();
    return 0;
}


void Dijkstra(vector <pair<int, int> > v[MMAX])
{
    d[s] = 0;
    Q.push(s);
    int x;
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        for(vector<pair<int, int> >::iterator it = v[x].begin();it!= v[x].end(); ++it)
        {
            if(d[it->first]  > d[x] + it->second)
            {
                d[it->first] = d[x] + it->second;
                Q.push(it->first);
            }

        }

    }
}

/*
 for(const auto& y: v[x])
        {
            if(d[y.first] > d[x] + y.second)
            {
                d[y.first] = d[x] + y.second;
                Q.push(y.first);
            }
        }
*/