Cod sursa(job #1189419)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 22 mai 2014 20:12:47
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<fstream>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int INFINIT = 99999999;
vector<int> v[50009];
vector<int> cost[5009];
int viz[50009],sol[50009],rez[50009],n,m,s;
queue<int> coada;

void init()
{

    for(int i = 1 ; i <= n ; i++)
    {

        sol[i] = INFINIT;
        viz[i] = 0;
    }
}

void bmf(int start)
{

    int i,k;
    coada.push(start);
    if(rez[start] != 0){
        out<<"NU\n";
        return;
    }
    viz[start] = 1;
    while(!coada.empty()){
    viz[coada.front()] = 0;
    for(i = 0 ; i < coada.front() ; i++){
           k = v[coada.front()][i];
            if(sol[coada.front()] < INFINIT){
                if(sol[k] > sol[coada.front()] + cost[coada.front()][i]){
                    sol[k] = sol[coada.front()] + cost[coada.front()][i];
                    if(sol[k] < rez[k]){
                        out<<"NU\n";
                        return;
                    }
                    if(viz[k] == 0)
                        {
                            viz[k] = 1;
                            coada.push(k);
                        }
                }
            }
        }
        coada.pop();
    }
    for(i = 1 ; i <= n ; i++)
    if(rez[i] != sol[i]){
        out<<"NU\n";
        return;
    }

    out<<"DA\n";
}

int main()
{

    int T,i,x,y,c;
    in>>T;
    for( ; T ; --T)
    {

        init();
        in>>n>>m>>s;
        for(i = 1 ; i <= n ; i++)
            in>>rez[i];
        for(i = 1 ; i <= m ; i++)
        {

            in>>x>>y>>c;
            cost[x].push_back(c);
            cost[y].push_back(c);
            v[x].push_back(y);
            v[y].push_back(x);
        }
        bmf(s);

    }
}