Cod sursa(job #2536009)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 1 februarie 2020 13:36:32
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;

const int N = 50001;
const int M = 100001;
const int INF = 1e9;

int vf[M], urm[M], cost[M], lst[N], d[N], ans[N], nr, n;
bool visited[N];

priority_queue <pair<int, int> > h;

void adauga(int x, int y, int c){
    vf[++nr] = y;
    cost[nr] = c;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void reset(){
    nr = 0;
    for(int i=1; i<=n; i++)
        d[i] = INF, lst[i] = 0, visited[i] = false;
}

void dijkstra(int x0){
    d[x0] = 0;
    h.push(make_pair(0,x0));
    while(!h.empty()){
        if(visited[h.top().second] == true){
            h.pop();
            continue;
        }
        int node = h.top().second;
        visited[node] = true;
        h.pop();
        for(int p=lst[node]; p!=0; p=urm[p]){
            int next = vf[p];
            int c = cost[p];
            if(d[node] + c < d[next]){
                d[next] = d[node] + c;
                h.push(make_pair(-d[next], next));
            }
        }
    }
}

int main()
{
    FILE *fin, *fout;
    int m,i,x,y,c,t,start;
    bool valid;
    fin = fopen("distante.in","r");
    fout = fopen("distante.out","w");
    fscanf(fin,"%d",&t);
    while(t--){
        fscanf(fin,"%d %d %d",&n,&m,&start);
        for(i=1; i<=n; i++)
            fscanf(fin,"%d",&ans[i]);
        reset();
        for(i=0; i<m; i++){
            fscanf(fin,"%d %d %d",&x,&y,&c);
            adauga(x,y,c);
        }
        dijkstra(start);
        valid = true;
        for(i=1; i<=n; i++)
            if(d[i] != ans[i])
                valid = false;
        if(valid)
            fprintf(fout,"DA\n");
        else
            fprintf(fout,"NU\n");
    }
    fclose(fin);
    fclose(fout);
    return 0;
}