Cod sursa(job #1648624)

Utilizator AlexxanderXPrisacariu Alexandru AlexxanderX Data 11 martie 2016 11:00:17
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>

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

const int inf = 1 << 30;

struct muchie {
    int des;
    int cost;
};
std::vector<muchie> noduri[50001];
int distante[50001];
int distanteO[50001];
bool locked[50001];
std::queue<int> lista;
int n, m, s;

void cautaDrumuri() {
    lista.push(s);
    distante[s] = 0;
    while (!lista.empty()) {
        int x = lista.front();
        lista.pop();

        locked[x] = 0;
        for (int i=0; i<noduri[x].size(); ++i) {
            int drum = distante[x] + noduri[x][i].cost;
            if (drum < distante[noduri[x][i].des]) {
                distante[noduri[x][i].des] = drum;

                if (!locked[noduri[x][i].des]) {
                    locked[noduri[x][i].des] = 1;
                    lista.push(noduri[x][i].des);
                }
            }
        }
    }
}

void citesteGraf() {
    f >> n >> m >> s;

    for (int i=1; i<=n; ++i) {
        f >> distanteO[i];
        distante[i] = inf;
        locked[i] = 0;
        noduri[i].clear();
    }

    int x, y, c;
    for (int i=0; i<m; ++i) {
        f >> x >> y >> c;
        muchie a; a.des = y; a.cost = c;
        noduri[x].push_back(a);
    }

    cautaDrumuri();

    for (int i=1; i<=n; ++i) {
        if (distante[i] == inf) distante[i] = 0;
        if (distante[i] != distanteO[i]) {
            g << "NU\n";
            return;
        }
    }
    g << "DA\n";
}

int main() {
    int grafuri;
    f >> grafuri;
    for (int i=0; i<grafuri; ++i) {
        citesteGraf();
    }
}