Cod sursa(job #2485621)

Utilizator YetoAdrian Tonica Yeto Data 1 noiembrie 2019 20:12:53
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <vector>
#include <climits>
#include <queue>
#define inf INT_MAX
using namespace std;
int T, n, m, srs, i, j, a, b, c, d[50001], sol[50001], e;
vector < pair <int, int> > g[50001];
bool viz[50001];
ifstream fin ("distante.in");
ofstream fout ("distante.out");

struct cmp {
    bool operator() (pair <int, int> &x, pair <int, int> &y) const {
        return x.second>y.second;
    }
};
priority_queue < pair <int, int> , vector < pair <int, int> > , cmp> q;

void dijkstra (int s)
{
    int nod, nv, cost;
    for (i=1;i<=n;i++) {
        viz[i]=0;
        d[i]=inf;
    }

    d[s]=0;
    q.push({s, 0});
    while (!q.empty()) {
        pair <int, int> p=q.top();
        if (viz[p.first]==1) {
            q.pop();
            continue;
        }

        nod=p.first;
        viz[nod]=1;
        for (i=0;i<g[nod].size();i++) {
            nv=g[nod][i].first;
            cost=g[nod][i].second;
            if (viz[nv]==0 && d[nv]>d[nod]+cost) {
                d[nv]=d[nod]+cost;
                q.push({nv, d[nv]});
            }
        }
    }
}

int main () {
    fin>>T;
    for (int cnt=1;cnt<=T;cnt++) {
        e=0;
        fin>>n>>m>>srs;
        for (i=1;i<=n;i++) {
            fin>>sol[i];
        }

        for (i=1;i<=m;i++) {
            fin>>a>>b>>c;
            g[a].push_back({b, c});
            g[b].push_back({a, c});
        }

        dijkstra(srs);
        for (i=1;i<=n;i++) {
            if (d[i]==inf)
                d[i]=0;
        }
        for (i=1;i<=n;i++) {
            if (d[i]!=sol[i]) {
                fout<<"NU";
                e=1;
                break;
            }
        }
        if (e==0)
            fout<<"DA";
        fout<<'\n';
    }
    return 0;
}