Cod sursa(job #2175455)

Utilizator remus88Neatu Remus Mihai remus88 Data 16 martie 2018 17:15:53
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 50009
#define Emax 100009
#define INF 2<<30

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

typedef pair <int, int> edge;
#define x first
#define c second

int n,m,S,T,d[Nmax],x,y,c,verif[Nmax];
vector <edge> G[Nmax];

struct compare {

    bool operator() (const edge &a, const edge &b) const {

        return d[a.x]<d[b.x];
    }
};

priority_queue <edge, vector<edge>, compare> Q;

void Clearcontent(int n) {

    for (int i=1; i<=n; ++i) d[i]=INF;

    for (int i=1; i<=n; ++i) G[i].clear();
}

void ReadInput() {

    f>>n>>m>>S;

    Clearcontent(n);

    for (int i=1; i<=n; ++i) f>>verif[i];

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

        f>>x>>y>>c;
        G[x].push_back(edge(y,c));
        G[y].push_back(edge(x,c));
    }

}

void Dijkstra(int source) {

    d[source]=0;
    Q.push(edge(source,0));

    while (!Q.empty()) {

        edge aux = Q.top();
        Q.pop();

        int node=aux.x;
        int cost=aux.c;

        for (auto it: G[node]) {

            int x=it.x;
            int c=it.c;

            if (d[x]==INF || d[x]> d[node] + c) {

                d[x] = d[node] + c;
                Q.push( edge( x, d[x]) );
            }
        }
    }
}

void Solve() {

    ReadInput();

//    for (int i=1; i<=n; ++i) {
//
//        g<<i<<":  ";
//        for (auto x: G[i]) g<<"("<<x.x<<' '<<x.c<<")  ";
//        g<<'\n';
//    }

    Dijkstra(S);

//    for (int i=1; i<=n; ++i) g<<d[i]<<' ';
//    g<<'\n';

    for (int i=1; i<=n; ++i)
        if (d[i]!=verif[i]) {

            g<<"NU\n";
            return;
        }

    g<<"DA\n";
}

int main() {

    f>>T;
    for (int i=1; i<=T; ++i)
        Solve();

    f.close(); g.close();
    return 0;
}