Cod sursa(job #2037826)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 12 octombrie 2017 20:43:37
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
#define INF 2000000000
#define DIM_M 100002
#define DIM_N 50002

using namespace std;

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

int T, viz[DIM_N], n, m, d[DIM_N], NOD, sol[DIM_N], x, y, cost, ok;

class compare
{
public:
    bool operator() (int a, int b)
    {
        return d[a] < d[b];
    }
};

multiset <int, compare> s;
multiset <int, compare>::iterator it;

vector <pair<int, int> > graf[DIM_N];

int main()
{
    f>>T;
    for(int tt = 1; tt <= T; ++ tt)
    {
        f>>n>>m>>NOD;
        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));
        }
        s.insert(NOD);
        for(int i = 0; i <= n; ++ i)
            d[i] = INF;
        d[NOD] = 0;
        for(int i = 1; i <= n; ++ i)
        {
            int nod = *s.begin();
            viz[nod] = 1;
            s.erase(s.begin());
            for(int j = 0; j < graf[nod].size(); ++ j)
            {
                pair<int, int> nodc = graf[nod][j];
                if(viz[nodc.first] == 0)
                {
                    if(d[nodc.first] == INF)
                    {
                        d[nodc.first] = d[nod] + nodc.second;
                        s.insert(nodc.first);
                    }
                    else if(d[nod] + nodc.second < d[nodc.first])
                    {
                        it = s.find(nodc.first);
                        s.erase(it);
                        d[nodc.first] = d[nod] + nodc.second;
                        s.insert(nodc.first);
                    }
                }
            }
        }
        ok = 1;
        for(int i = 1; i <= n; ++ i)
            if(sol[i] != d[i])
                ok = 0;
        if(ok == 1)
            g<<"DA\n";
        else
            g<<"NU\n";
        for(int i = 1; i <= n; ++ i)
        {
            graf[i].clear();
            viz[i] = 0;
        }
        s.clear();
    }
    return 0;
}