Cod sursa(job #1546864)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 8 decembrie 2015 19:55:05
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <vector>
#include <set>
#include <bitset>

#define DIM 100005
#define INF (1 << 30)

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

int N, M, source, numberVertiges;
int D[DIM], D2[DIM], a, b, c, T;
pair< int, int > p;
bitset< DIM >v;
vector<pair < int, int> > L[DIM];

//folosesc set pentru complexitate de timp(este un arbore binar de cautare )
// cu minimul in cea mai din stanga frunza
set <pair <int, int> > s;

bool dijkstra(int source)
{


    if(D2[source] != 0)
    {
        return false;
    }
    // initializez distantele de la sursa la noduri cu infinit
    for(int i = 1; i <= N; i ++)
    {
        D[i] = INF;
    }

    D[source] = 0;
    s.insert(make_pair(source, 0));
    numberVertiges = 0;

    while(numberVertiges <= N)
    {
        if(s.empty())
        {
            break;
        }

        p = *s.begin(); // iau minimul
        s.erase(s.begin()); // si il scot din set
        numberVertiges ++;
        v[p.first] = 1; // marchez ca fiind vizitat

        for(vector <pair <int, int> >::iterator it = L[p.first].begin(); it != L[p.first].end(); it ++)
        {
            if(D[it -> first] > D[p.first] + it -> second)
            {
                s.erase(make_pair(it -> first, D[it -> first]));
                D[it -> first] = D[p.first] + it -> second;
                s.insert(make_pair(it -> first, D[it -> first]));
            }
        }
    }

    for(int i = 1; i <= N; i ++)
    {
        if(D[i] != D2[i])
        {
            return false;
        }
    }

    return true;
}


int main()
{
    fin >> T;

    while(T --)
    {
        fin >> N >> M >> source;

        for(int i = 1; i <= N; i ++)
        {
            fin >> D2[i];
        }

        for(int i = 1; i <= M; i ++)
        {
            fin >> a >> b >> c;
            L[a].push_back(make_pair(b, c));
            L[b].push_back(make_pair(a, c));
        }

        if(dijkstra(source))
        {
            fout << "DA\n";
        }
        else
        {
            fout << "NU\n";
        }

        for(int i = 1; i <= N; i ++)
        {
            L[i].erase(L[i].begin(), L[i].end());
            v[i] = 0;
            D[i] = 0;
            D2[i] = 0;
        }

    }

    return 0;
}