Cod sursa(job #1546891)

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

#define DIM 100005
#define INF 2000000000

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)
{

    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( !v[it -> first] && 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];
            D[i] = INF;
            L[i].clear();
            v[i] = 0;
        }

        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";
        }

    }

    return 0;
}