Cod sursa(job #861013)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 20 ianuarie 2013 21:36:28
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

#define inf 100000000

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

struct nod_g{
    int nod, cost;
};

vector< vector<nod_g> > graf;
vector<unsigned int> cost1;
vector<nod_g>::iterator it;
nod_g temp;
int n, m, t, s;

void citire(){
    int x, y, c;
    f >> n >> m >> s;
    graf.clear();
    cost1.clear();
    graf.resize(n+1);
    cost1.resize(n+1);

    for(int i = 1; i <= n; ++i) f >> cost1[i];
    for(int i = 1; i <= m; ++i){
        f >> x >> y >> c;
        temp.nod = y; temp.cost = c;
        graf[x].push_back(temp);
    }
}

void dijkstra(){
    queue<unsigned int> coada;
    vector<unsigned int> cost2;
    int primul = s;
    cost2.resize(n+1, inf);
    cost2[s] = 0;
    coada.push(primul);

    while(!coada.empty()){
        for(it = graf[primul].begin(); it != graf[primul].end(); ++it)
            if(cost2[it->nod] > cost2[primul] + it->cost){
                cost2[it->nod] = cost2[primul] + it->cost;
                coada.push(it->nod);
            }
        coada.pop();
        primul = coada.front();
    }
    for(int i = 1; i <= n; ++i){
        if(cost2[i] == inf) cost2[i] = 0;
        if(cost2[i] != cost1[i]){
            g << "NU\n";
            return;
        }
    }
    g << "DA\n";
}

int main(){
    f >> t;
    for(int i = 1; i <= t; ++i){
        citire();
        dijkstra();
    }
    f.close();
    g.close();

    return 0;
}