Cod sursa(job #1266635)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 18 noiembrie 2014 22:53:56
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
/// Craciun Catalin
///  Distante
#include <iostream>
#include <fstream>
#include <set>
#include <vector>

#define mp make_pair
#define ins insert
#define inf 1<<30
#define NMax 50005

using namespace std;

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

int t;
int n, m, s;
set< pair<int, int> > heap;
int distEs[NMax];
int dist[NMax];
vector<int> Vec[NMax];
vector<int> C[NMax];

void compare() {

    bool ok = true;
    for (int i=1;i<=n;i++)
        if (dist[i] != distEs[i]) {
            ok = false;
            break;
        }

    if (ok)
        g<<"DA\n";
    else
        g<<"NU\n";
}

void dijkstra() {

    heap.clear();

    for (int i=1;i<=n;i++)
        dist[i] = inf;
    dist[s] = 0;

    heap.ins(mp(0,s));
    while (!heap.empty()) {
        int val = (*heap.begin()).first, nod = (*heap.begin()).second;
        heap.erase(heap.begin());

        for (unsigned i=0;i<Vec[nod].size();i++) {
            int vecin = Vec[nod][i];
            if (dist[vecin] > dist[nod] + C[nod][i]) {
                heap.erase(mp(dist[vecin], vecin));
                dist[vecin] = dist[nod] + C[nod][i];
                heap.insert(mp(dist[vecin], vecin));
            }
        }
    }

    compare();
}

void read() {

    f>>t;
    for (int q=1;q<=t;q++) {
        f>>n>>m>>s;
        for (int i=1;i<=n;i++)
            f>>distEs[i];
        for (int i=1;i<=n;i++) {
            Vec[i].resize(0);
            C[i].resize(0);
        }
        for (int i=1;i<=m;i++) {
            int x, y, c; f>>x>>y>>c;
            Vec[x].push_back(y); C[x].push_back(c);
            Vec[y].push_back(x); C[y].push_back(c);
        }

        dijkstra();
    }
}

int main() {

    read();

    f.close(); g.close();

    return 0;
}