Cod sursa(job #2289258)

Utilizator alex.carpCarp Alexandru alex.carp Data 24 noiembrie 2018 12:23:54
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int NMAX=50010;
const int oo=(1<<20);
int c[NMAX],d[NMAX],n,m,s,T;
bool vizitat[NMAX];
vector<pair<int,int> >G[NMAX];
struct comp
{
    bool operator() (int i,int j)
    {
        return c[i]>c[j];
    }
};
priority_queue<int,vector<int>,comp>coada;
void citire()
{
    int x,y,z;
    f>>n>>m>>s;
    for(int i=1;i<=n;i++)
        f>>d[i];
    for(int i=1;i<=n;i++)
        G[i].clear();
    for(int i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        G[x].push_back(make_pair(y,z));
        G[y].push_back(make_pair(x,z));
    }
}
bool dijkstra(int sursa)
{
    for(int i=1;i<=n;i++)
        vizitat[i]=0;
    for(int i=1;i<=n;i++)
        c[i]=oo;
    c[sursa]=0;
    if(c[sursa]<d[sursa])return 0;
    coada.push(sursa);
    vizitat[sursa]=1;
    while(!coada.empty())
    {
        int ncrt=coada.top();
        coada.pop();
        vizitat[ncrt]=0;
        for(int i=0;i<G[ncrt].size();i++)
        {
            int vecin=G[ncrt][i].first;
            int cost=G[ncrt][i].second;
            if(vizitat[vecin]==0 && c[ncrt]+cost<c[vecin])
            {
                c[vecin]=c[ncrt]+cost;
                if(c[vecin]<d[vecin])return 0;
                vizitat[vecin]=1;
                coada.push(vecin);
            }
        }
    }
    return 1;
}
void afisare()
{
    for(int i=1;i<=n;i++)
        if(d[i]!=c[i]){g<<"NU"<<'\n';return;}
    g<<"DA"<<'\n';
}
int main()
{
    f>>T;
    while(T)
    {
        citire();
        if(dijkstra(s))
        {
            afisare();
        }
        else g<<"NU"<<'\n';
        T--;
    }
    return 0;
}