Cod sursa(job #2802831)

Utilizator e_ggIonescu Dorian e_gg Data 18 noiembrie 2021 21:07:06
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;

auto cmp = [](pair <int, int> x, pair <int, int> y) {
    return (x.first > y.first) || (x.first == y.first && x.second > y.second);
};
ifstream f("distante.in");
ofstream g("distante.out");
vector<pair<int,int>> v[100003];
priority_queue<pair<int,int>, vector<pair <int, int>>, decltype(cmp)> pq(cmp);
//priority_queue<pair<int,int>, vector<pair <int, int>>, greater<pair <int, int>> ()> pq(cmp);

int viz[50005];
int cost[50005];
int dist[50005];
int main()  {
    int n,m,s,a,b,c,x,y,t,ok;
    f>>t;
    for(int p=1;p<=t;p++){
        f>>n>>m>>s;
        for(int i=1;i<=n;i++)
            f>>dist[i];
        for(int i=1;i<=n;i++)
            v[i].clear();
        for(int i=1;i<=m;i++){
            f>>a>>b>>c;
            v[a].push_back({b,c});
            v[b].push_back({a,c});
        }
        for (int i = 1; i <= n; ++i)
            cost[i] = 1e9;
        for (int i = 1; i <= n; ++i)
            viz[i] = 0;
        pq.push({0,s});
        cost[s]=0;
        while(!pq.empty()){
            x=pq.top().first;
            y=pq.top().second;
            pq.pop();
            if(viz[y])
                continue;
            viz[y]=1;
            for(int i=0;i<v[y].size();i++){
                if(!viz[v[y][i].first]&&cost[v[y][i].first]>x+v[y][i].second){
                    cost[v[y][i].first]=x+v[y][i].second;
                    pq.push({cost[v[y][i].first],v[y][i].first});
                }
            }
        }
        ok=1;
        for(int i=1;i<=n&&ok;i++)
            if(cost[i]!=dist[i])
                ok=0;
        g<<(ok==1?"DA\n":"NU\n");
    }
    f.close();
    g.close();
    return 0;
}