Cod sursa(job #1043418)

Utilizator BartieSocaciu Vlad Bartie Data 28 noiembrie 2013 16:01:23
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <climits>

#define INFINIT INT_MAX
#define mp make_pair

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

struct element{
    int vf;
    int d;
};

int caz,n,m,nod,d[50005],d_fin[50005];
vector<element> V[50005];
set< pair<int,int> > T;

int main()
{
    fin>>caz;//numar cazuri
    for(;caz;caz--){
        //reinitializez vectorul de elemente
        for(int i=1;i<=n;i++){
            V[i].clear();
        }
        fin>>n>>m>>nod;//citesc nr noduri,nr muchii,nod radacina
        for(int i=1;i<=n;i++)//reinitializez vectorul distanta
            d[i]=INFINIT;
        //CITIRE
        for(int i=1;i<=n;i++){
            fin>>d_fin[i];
        }
        int a;element b,c;
        for(;m;m--){
            fin>>a>>b.vf>>b.d;
            V[a].push_back(b);
            c.vf=a;c.d=b.d;
            V[b.vf].push_back(c);
        }

        //DIJKSTRA
        d[nod]=0;
        T.insert(mp(0,nod));
        while(T.size()>0){
            int dist_act,nodu;
            dist_act=(*T.begin()).first;
            nodu=(*T.begin()).second;
            T.erase(*T.begin());
            for(int i=0;i<V[nodu].size();i++){
                int urm,d_urm;
                urm=V[nodu][i].vf;
                d_urm=V[nodu][i].d;
                if(d[urm]>dist_act+d_urm){
                    d[urm]=dist_act+d_urm;
                    T.insert(mp(d[urm],urm));
                }
            }
        }

        //VERIFICARE FINALA
        bool OK=true;
        for(int i=1;i<=n;i++)
            if(d[i]!=d_fin[i])
                OK=false;
        if(OK==true)
            fout<<"DA\n";
        else
            fout<<"NU\n";
    }
    return 0;
}