Cod sursa(job #2194784)

Utilizator IustinPetrariuIustinian Petrariu IustinPetrariu Data 14 aprilie 2018 13:17:37
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>
#define NMAX 50001
#define inf 20000000

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

int T;
struct punct
{
    int y,c;

};
vector < punct > G[NMAX];
int N,M,r,dist[NMAX],d[NMAX],inque[NMAX];
struct compara
{
    bool operator()( int x, int y)
    {
        return d[x] > d[y];
    }
};
void dijkstra(int node)
{
    int k,lg;
    priority_queue<int, vector<int>,compara>q;
    for(int i =1 ; i <= N; i ++)
        dist[i]=inf;
    dist[node]=0;
    q.push(node);
    inque[node]=1;
    while(!q.empty())
    {
        k=q.top();
        q.pop();
        inque[k]=0;
        for(int i = 0 ; i < G[k].size(); i++)
        {
            int y=G[k][i].y;
            int c=G[k][i].c;
            lg=dist[k]+c;
            if(lg<dist[y])
            {
                dist[y]=lg;
                if(inque[y]==0)
                {
                    q.push(y);
                    inque[y]=1;
                }
            }
        }
    }

}
int main()
{
    fin>>T;
    while(T--)
    {
        fin>>N>>M>>r;
        for(int i =1 ; i <= N;  i++)
            fin>>d[i];
        for(int i = 1; i <= M; i++)
        {
            int x,y,c;
            punct u;
            fin>>x>>u.y>>u.c;
            G[x].push_back(u);
        }
        dijkstra(r);
        int ok=1;
        for(int j = 1; j <= N; j ++)
            if(dist[j]!=d[j])
            {
                ok=0;
                break;
            }
        if(!ok) fout<<"NU"<<'\n';
        else fout<<"DA"<<'\n';
        for(int l=1; l <= N; l++)
        {
            G[l].clear();
        }
    }



    return 0;
}