Cod sursa(job #2275187)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 2 noiembrie 2018 21:30:24
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

const int MAXN = 50000 + 5,MAXM = 100000 + 5,INF = 2e9;

using namespace std;

typedef pair<int,int> pii;

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

vector<pii>graf[MAXM];
priority_queue<pii, vector<pii>, greater<pii> >heap;
int n,m,start,dp[MAXN],calc[MAXN];

void initialize(){
    for(int i = 1; i <= n; i++)
        graf[i].clear();
    while(!heap.empty())
        heap.pop();
}
void dijsktra(int start){
    for(int i = 1; i <= n; i++)
        dp[i] = INF;
    heap.push({0,start});
    dp[start] = 0;

    while(heap.size()){
        int nod = heap.top().second;
        heap.pop();
        for(int i = 0; i < graf[nod].size(); i++){
            pii curent = graf[nod][i];
            int vecin = curent.first,cost = curent.second;
            if(dp[nod] + cost < dp[vecin]){
                dp[vecin] = dp[nod] + cost;
                heap.push({dp[vecin],vecin});
            }
        }
    }
    for(int i = 1; i <= n; i++)
        if(dp[i] == INF)
            dp[i] = 0;
}
string solve(){
    initialize();
    in>>n>>m>>start;
    for(int i = 1; i <= n; i++)
        in>>calc[i];
    for(int i = 1; i <= n; i ++){
        int nod,muchie,cost;
        in>>nod>>muchie>>cost;
        graf[nod].push_back(make_pair(muchie,cost));
        graf[muchie].push_back(make_pair(nod,cost));
    }

    dijsktra(start);
    for(int i = 1; i <= n; i++)
        if(dp[i] != calc[i])
            return "NU";
    return "DA";
}
int main()
{
    in.tie(nullptr);
    out.tie(nullptr);
    ios::sync_with_stdio(false);

    int t;
    in>>t;
    for(int i = 1; i <= t; i++){
        out<<solve()<<"\n";
        initialize();
    }
    return 0;
}