Cod sursa(job #2466428)

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

using namespace std;

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

const int N = 100005;

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

int x, y, w, n, m, base;

void dijkstra()
{
    s.clear();
    ds[base] = 0;
    int lg = 0;
    s.insert({0, base});
    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) fout << "DA\n";
    else fout << "NU\n";
}
int main()
{
    ios::sync_with_stdio(false);
    fin.tie(0);

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