Cod sursa(job #2571494)

Utilizator luci.tosaTosa Lucian luci.tosa Data 5 martie 2020 00:06:45
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 50001
#define INF 1e9
using namespace std;

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

int t,n,m,s,p;
int dist[NMAX];
int h[NMAX],v[NMAX],pos[NMAX];
struct graph {
    int n,c;
};
vector <graph> g[11][NMAX];

void change(int p,int q) {
    swap(h[p],h[q]);
    pos[h[p]]=p;
    pos[h[q]]=q;
}
void up(int k) {
    while(k>1 && v[h[k]]<v[h[k/2]]) {
        change(k,k/2);
        k/=2;
    }
}
void down(int k) {
    int son=0;
    int ls=2*k,rs=2*k+1;
    if(ls<=n) {
        son=ls;
        if(rs<=n && v[h[ls]]>v[h[rs]])
            son=rs;
        if(v[h[son]]>=v[h[k]])
            son=0;
    }
    if(son) {
        change(k,son);
        down(son);
    }
}
void del(int k) {
    change(k,n);
    n--;
    up(k);
    down(k);
}
void dijkstra(int node) {
    for(int i=0; i<(int)g[p][node].size(); i++) {
        graph aux=g[p][node][i];
        if(v[aux.n]>v[node]+aux.c) {
            v[aux.n]=v[node]+aux.c;
            up(pos[aux.n]);
        }
    }
    if(n>0) {
        int next=h[1];
        del(1);
        dijkstra(next);
    }
}
int main() {
    fin>>t;
    for(p=1; p<=t; p++) {
        fin>>n>>m>>s;
        int nr=n;
        for(int i=1; i<=n; i++) {
            fin>>dist[i];
            v[i]=INF;
            h[i]=i;
            pos[i]=i;
        }
        for(int i=1; i<=m; i++) {
            int a,b,c;
            graph aux;
            fin>>a>>b>>c;
            aux.c=c;
            aux.n=b;
            g[p][a].push_back(aux);
            aux.n=a;
            g[p][b].push_back(aux);
        }
        v[s]=0;
        del(s);
        dijkstra(s);
        bool ok=1;
        n=nr;
        for(int i=1;i<=n && ok==1;i++)
            if(v[i]!=dist[i])
                ok=0;
        if(ok==0)
            fout<<"NU\n";
        else
            fout<<"DA\n";
    }
    return 0;
}