Cod sursa(job #1546918)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 8 decembrie 2015 20:42:18
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <vector>
#include <queue>
#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, ok[DIM];
pair< int, int > p;

bitset< DIM >v;
vector<pair < int, int> > L[DIM];

//folosesc heap pentru complexitate de timp(este un arbore binar de cautare )
struct cmp {
    bool operator()(pair<int, int> a, pair<int, int> b) {
        return a.first > b.first;
    }
};
priority_queue<pair<int, int>, vector< pair<int, int> >, cmp> H;

bool dijkstra(int source)
{

    D[source] = 0;
    H.push(make_pair(0, source));

    while(!H.empty()){
        pair<int, int> st = H.top();
        H.pop();
        v[st.second] = 1;
        //D[st.second] = st.first;
        for(int i = 0 ; i < L[st.second].size(); i ++)
        {
            p = L[st.second][i];
            if( !v[p.second] && D[p.second] > D[st.second] + p.first){
                D[p.second] = D[st.second] + p.first;
                H.push(make_pair(D[p.second], p.second));

            }
        }

    }

    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(c, b));
            L[b].push_back(make_pair(c, a));
        }

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

    }

    return 0;
}