Cod sursa(job #1538158)

Utilizator SmitOanea Smit Andrei Smit Data 28 noiembrie 2015 16:25:24
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

struct Nod
{
    int nod,cost;
    bool operator < (const Nod& e)
const
    {
        return cost>e.cost;
    }
};

int n,m,Sr,T,d[50003],sol[50003];
vector<Nod>L[50003];

inline void Dijkstra()
{
    int i,c,j;
    unsigned int k;
    Nod w,w1;
    priority_queue<Nod>q;
    //for(i=1;i<=n;++i)   sol[i]=1000000000;
    sol[Sr]=0;
    w.nod=Sr;
    w.cost=0;
    q.push(w);
    while(!q.empty())
    {
        w=q.top();
        q.pop();
        i=w.nod;
        for(k=0;k<L[i].size();++k)
        {
            j=L[i][k].nod;
            c=L[i][k].cost;
            if(sol[j]>sol[i]+c)
            {
                sol[j]=sol[i]+c;
                w1.nod=j;
                w1.cost=sol[j];//???
                q.push(w1);
            }
        }
    }
}

inline void Citire()
{
    int i,test,x,y,c,ok;
    Nod w;
    ifstream fin("distante.in");
    ofstream fout("distante.out");
    fin>>T;
    for(test=1;test<=T;++test)
    {
        fin>>n>>m>>Sr;
        for(i=1;i<=n;++i)
        {
            L[i].clear();
            sol[i]=2000000000;
            fin>>d[i];
        }
        for(i=1;i<=m;++i)
        {
            fin>>x>>y>>c;
            w.nod=y;
            w.cost=c;
            L[x].push_back(w);
        }
        Dijkstra();
        ok=1;
        for(i=1;i<=n && ok;++i)
            if(sol[i]!=d[i])    ok=0;
        if(ok)  fout<<"DA\n";
        else  fout<<"NU\n";
    }
    fin.close();
    fout.close();
}

int main()
{
    Citire();
    return 0;
}