Cod sursa(job #1736573)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 2 august 2016 00:17:54
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>

#define NMAX 50005
#define inf 2000000000

using namespace std;

int K;
int N,M,start;
vector<pair<int,int> > graf[NMAX];
priority_queue<pair<int,int> > q;
int da[NMAX];

int d[NMAX];


void djikstra()
{
    q.push(make_pair(0,start));
    while(!q.empty())
    {
        int nod = q.top().second;
        int cost = -q.top().first;

        for(vector<pair<int,int> >::iterator ii = graf[nod].begin();ii!=graf[nod].end();ii++)
        {
            int x = ii->first;
            int c = ii->second;
            if(cost + c < d[x])
            {
                d[x] = cost + c;
                q.push(make_pair(-d[x],x));
            }
        }
        q.pop();
    }
}

void citire()
{
    scanf("%d",&K);
    for(int k=1; k<=K; k++)
    {
        scanf("%d%d%d",&N,&M,&start);
        for(int i=1; i<=N; i++)
        {
            d[i]=inf;
            graf[i].clear();
        }



        d[start]=0;
        for(int i=1; i<=N; i++)
            scanf("%d",&da[i]);

        for(int i=1; i<=M; i++)
        {
            int x,y,c;
            scanf("%d%d%d",&x,&y,&c);
            graf[x].push_back(make_pair(y,c));
            graf[y].push_back(make_pair(x,c));
        }

        djikstra();

        int ok=1;
        for(int i=1;i<=N;i++)
            if(d[i]!=da[i])
            {
                ok = 0;
                break;
            }
        if(ok) printf("DA\n");
        else printf("NU\n");
    }
}



int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    citire();
    return 0;
}