Cod sursa(job #1894878)

Utilizator lauratalaatlaura talaat lauratalaat Data 27 februarie 2017 17:03:27
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<utility>
using namespace std;
int n,m,nods;
priority_queue< pair<int, int>, vector<pair<int, int> >, greater < pair <int, int > > > heap;
vector<pair<int,int> >lista[50001];
int dist[50001],distante[50001];
void citire(){
    int i,a,b,c;
    scanf("%d%d%d",&n,&m,&nods);
    for(i=1;i<=n;i++)
        scanf("%d",&distante[i]);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        lista[a].push_back(make_pair(c,b));
        lista[b].push_back(make_pair(c,a));
    }
}
void dijkstra(int nod){
    int i,pp,from,d,to,edge;
    heap.push(make_pair(0,nod));
    for(i=1;i<=n;i++)
        dist[i]=999999999;
    dist[nod]=0;
    while(!heap.empty()){
        pp=1;
        from=heap.top().second;
        d=heap.top().first;
        heap.pop();
        if(dist[from]!=d)
            pp=0;
        for(i=0;i<lista[from].size()&&pp==1;i++){
            to=lista[from][i].second;
            edge=lista[from][i].first;
            if(dist[to]>d+edge){
                dist[to]=d+edge;
                heap.push(make_pair(d+edge,to));
            }
        }
    }
}
int main(){
    int T,l,i,pp;
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&T);
    for(l=1;l<=T;l++){
        citire();
        dijkstra(nods);
        pp=1;
        for(i=1;i<=n&&pp==1;i++)
            if(dist[i]!=distante[i])
                pp=0;
        if(pp==1)
            printf("DA\n");
        else
            printf("NU\n");
    }
    return 0;
}