Cod sursa(job #2466420)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 2 octombrie 2019 09:37:32
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
#define INF 2000000000


using namespace std;

const int N = 100005;

vector < pair < int, int >  > a[N];
vector < int > d(N), ds(N);
multiset < pair < int, int > > s;

void dijkstra(int root, int n)
{
    s.clear();
    ds[root] = 0;
    int lg = 0;
    s.insert({0, root});
    bool ok = true;
    while(!s.empty() && ok == true) {
        int v = s.begin() -> second;
        lg += s.begin() -> first;
        s.erase(s.begin());
        for(auto x : a[v]) {
            int to = x.first, len = x.second;
            if(ds[to] > ds[v] + len) {
                s.erase({ds[to], to});
                ds[to] = ds[v] + len;
                s.insert({ds[to], to});
            }
        }
        if(ds[v] != d[v]) ok = false;
    }
    if(ok == true) printf("DA\n");
    else printf("NU\n");
}
int main()
{
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);

    int tt;
    scanf("%d", &tt);
    while(tt--) {
        int n, m, base;
        scanf("%d%d%d", &n, &m, &base);
        for(int i = 1; i <= n; ++i) scanf("%d", &d[i]), ds[i] = INF, a[i].clear();
        for(int i = 1; i <= m; ++i) {
            int x, y, w;
            scanf("%d%d%d", &x, &y, &w);
            a[x].push_back({y, w});
            a[y].push_back({x, w});
        }
        dijkstra(base, n);
    }
    return 0;
}