Cod sursa(job #1639702)

Utilizator deiandreiMazilu Andrei deiandrei Data 8 martie 2016 13:33:21
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>

using namespace std;

//Pentru Dijkstra
#define INFINIT 0x3f3f3f3f
#define NMAX 50005
#define MMAX 100005

int Distante[NMAX];

void Dijkstra(vector< pair<int,int> > Graf[MMAX], int sursa) {
    queue<int> Coada;
    memset(Distante, INFINIT, sizeof(Distante));

    Coada.push(sursa);
    Distante[sursa] = 0;

    while(!Coada.empty()) {
        int p = Coada.front();
        Coada.pop();

        for(vector< pair<int,int> >::iterator Itr = Graf[p].begin(); Itr != Graf[p].end(); ++Itr) {
            if(Distante[Itr->first] > Distante[p] + Itr->second) {
                Distante[Itr->first] = Distante[p] + Itr->second;
                Coada.push(Itr->first);
            }
        }
    }
}

int main() {
    ifstream in("distante.in");
    ofstream out("distante.out");
    int cicluri;
    in>>cicluri;
    for(int k=1;k<=cicluri;++k) {
        vector< pair<int,int> > graf[MMAX];
        int n,m,sursa,verificare[NMAX];
        in>>n>>m>>sursa;

        for(int i=1;i<=n;++i) in>>verificare[i];
        for(int i=1;i<=m;++i) {
            int x,y,c;
            in>>x>>y>>c;
            graf[x].push_back({y,c});
            graf[y].push_back({x,c});
        }

        Dijkstra(graf, sursa);

        bool Ok=1;
        for(int i=1;i<=n;++i) {
            if(verificare[i] != (Distante[i] != INFINIT ? Distante[i] : 0)) Ok=0;
        }
        if(Ok) out<<"DA\n";
        else out<<"NU\n";
    }

    return 0;
}