Cod sursa(job #2427290)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 31 mai 2019 15:30:20
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

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

#define nmax 50005
#define INF 10000005

int t,n,m,s,d[nmax],x,y,c,Dist[nmax],nod_crt,vecin,cost;

bool in_coada[nmax];

struct compara
{
    bool operator()(int x, int y)
    {
        return Dist[x]>Dist[y];
    }
};

vector < pair<int,int> > v[nmax];

priority_queue <int, vector<int>, compara> coada;

void Dijkstra(int start)
{
    for(int i=1;i<=n;i++)
        Dist[i]=INF;
    Dist[start]=0;
    coada.push(start);
    in_coada[start]=true;
    while(!coada.empty())
    {
        nod_crt=coada.top();
        coada.pop();
        in_coada[nod_crt]=false;
        for(unsigned i=0;i<v[nod_crt].size();i++)
        {
            vecin=v[nod_crt][i].first;
            cost=v[nod_crt][i].second;
            if(Dist[nod_crt]+cost<Dist[vecin])
            {
                Dist[vecin]=Dist[nod_crt]+cost;
                if(in_coada[vecin]==false)
                {
                    coada.push(vecin);
                    in_coada[vecin]=true;
                }
            }
        }
    }
}

int vect[nmax],cd=0,aux,ok=1;

int main()
{
    fin>>t;
    for(int i=1;i<=t;i++)
    {
        ok=1;
        fin>>n>>m>>s;
        for(int j=1;j<=n;j++)
            fin>>d[j];
        for(int j=1;j<=m;j++)
        {
            fin>>x>>y>>c;
            v[x].push_back(make_pair(y,c));
            v[y].push_back(make_pair(x,c));
        }
        Dijkstra(s);
        for(int k=1;k<=n;k++)
        {
            if(Dist[k]!=d[k])
            {
                ok=0;
                break;
            }
        }
        if(!ok)
            fout<<"NU"<<'\n';
        else
            fout<<"DA"<<'\n';
        for(int j=1;j<=n;j++)
        {
            while(v[j].size()>0)
                v[j].pop_back();
        }
    }
}