Cod sursa(job #2038007)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 13 octombrie 2017 08:55:49
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <vector>
#include <set>
#define DIM 50002
#define INF 2000000

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

int T, t, nod, nodc, n, m, sursa, x, y, cost, sol[DIM], viz[DIM], d[DIM], ok;

set <pair<int, int> >s;
vector <pair<int, int> > graf[DIM];

int main()
{
    f>>T;
    for(int t = 1; t <= T; ++ t)
    {
        f>>n>>m>>sursa;
        for(int i = 1; i <= n; ++ i)
            f>>sol[i];
        for(int i = 1; i <= m; ++ i)
        {
            f>>x>>y>>cost;
            graf[x].push_back(make_pair(y, cost));
            graf[y].push_back(make_pair(x, cost));
        }
        for(int i = 1; i <= n; ++ i)
            d[i] = INF;
        d[sursa] = 0;
        s.insert(make_pair(0, sursa));
        for(int i = 1; i <= n && !s.empty(); ++ i)
        {

            nod = s.begin()->second;
            viz[nod] = 1;
            s.erase(s.begin());
            for(vector<pair<int, int> >::iterator it = graf[nod].begin(); it != graf[nod].end(); ++ it)
            {
                nodc = it->first;
                cost = it->second;
                if(d[nodc] > d[nod] + cost && viz[nodc] == 0)
                {
                    s.erase(make_pair(d[nodc], nodc));
                    d[nodc] = d[nod] + cost;
                    s.insert(make_pair(d[nodc], nodc));
                }
            }
        }
        ok = 1;
        for(int i = 1; i <= n; ++ i)
            if(d[i] != sol[i])
                ok = 0;
        if(ok == 1)
            g<<"DA"<<'\n';
        else
            g<<"NU"<<'\n';
        for(int i = 1; i <= n; ++ i)
        {
            sol[i] = d[i] = viz[i] = 0;
            graf[i].clear();
        }
        s.clear();
    }

    return 0;
}