Cod sursa(job #1740652)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 11 august 2016 22:49:43
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#define N 50100
#define INF 2000000000

using namespace std;


class cmp{
public:

    bool operator() ( pair<int,int> m1, pair<int,int> m2 ){
        return m1.second>m2.second;
    }

};

std::priority_queue <pair<int,int>, vector< pair<int,int> >,cmp  > que;

vector < pair <int,int> > muc[N];
vector < pair<int , int> >::iterator it;

int n,m,source;
int dist[N],distzah[N];
int viz[N];

void INIT(){
    static int i;

    for(i=0;i<=n;i++){
        dist[i]=INF;
        muc[i].clear();
        viz[i]=0;
    }

}

void dijkstra(){
    static int nod;

    dist[source]=0;

    que.push( make_pair( source,0) );

    while(!que.empty() ){
        while( !que.empty() && viz[ que.top().first ]  ){
            que.pop();
        }

        if(que.empty() ) {
            break;
        }

        nod=que.top().first;
        que.pop();

        for( it=muc[nod].begin(); it!=muc[nod].end() ; it++){
            if( viz[ it->first ]  ){
                continue;
            }
            if( dist[it->first]> dist[nod]+it->second ){
                dist[it->first]=dist[nod]+it->second;
                que.push( make_pair(it->first, dist[it->first] ) );
            }

        }
    }


}



int main(){
    int T,i;
    int x,y,z,spy;

    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);

    scanf("%d",&T);

    for(;T;T--){
        scanf("%d%d%d",&n,&m,&source);

        INIT();

        for(i=1;i<=n;i++){
            scanf("%d",&distzah[i]);
        }

        for(i=0;i<m;i++){
            scanf("%d%d%d",&x,&y,&z);

            muc[x].push_back( make_pair(y,z) );
            muc[y].push_back( make_pair(x,z) );

        }

        dijkstra();

        spy=0;
        for(i=1;i<n;i++){
            if(dist[i]!=distzah[i]){
                printf("NU\n");
                spy=1;
                break;

            }
        }
        if(spy==0){
            printf("DA\n");
        }


    }

    return 0;
}