Cod sursa(job #1535879)

Utilizator TibixbAndrei Tiberiu Tibixb Data 25 noiembrie 2015 12:28:33
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include<fstream>
#include<vector>
#define inf 2000000000
using namespace std;
vector < pair <int, int> > L[50002];
int T, n, m, S, s, p1, nod, x, y, z, i, D[50002], d[50002], h[50002], p[50002],                                            ok,           nrh, vecin, cost;
ifstream in("distante.in");
ofstream out("distante.out");
int main()
{
    in>>T;
    for(; T--; )
    {
        in>>n>>m>>S;
        for(i=1; i<=n; i++)
        {
            in>>d[i];
            D[i]=inf;
        }
        D[S]=0;
        for(i=1; i<=m; i++)
        {
            in>>x>>y>>z;
            L[x].push_back(make_pair(y, z));
            L[y].push_back(make_pair(x, z));
        }
        for(i=1; i<=n; i++)
            p[i]=0;
        h[++nrh]=S;
        p[S]=1;
        while(nrh!=0)
        {
            nod=h[1];
            h[1]=h[nrh];
            p[h[1]]=1;
            nrh--;
            p1=1;
            s=2;
            while(s<=nrh)
            {
                if(s+1<=nrh && D[h[s+1]]<D[h[s]])
                    s++;
                if(D[h[s]]<D[h[p1]])
                {
                    swap(h[s], h[p1]);
                    p[h[s]]=s;
                    p[h[p1]]=p1;
                    p1=s;
                    s*=2;
                }
                else
                    break;
            }
            for(i=0; i<L[nod].size(); i++)
            {
                vecin=L[nod][i].first;
                cost=L[nod][i].second;
                if(D[vecin]>D[nod]+cost)
                {
                    D[vecin]=D[nod]+cost;
                    if(p[vecin]!=0)
                    {
                        s=p[vecin];
                        p1=s/2;
                    }
                    else
                    {
                        h[++nrh]=vecin;
                        p[vecin]=nrh;
                        s=nrh;
                        p1=s/2;
                    }
                    while(p1!=0 && D[h[s]]<D[h[p1]])
                    {
                        swap(h[s], h[p1]);
                        p[h[s]]=s;
                        p[h[p1]]=p1;
                        s=p1;
                        p1/=2;
                    }
                }
            }
        }
        ok=1;
        for(i=1; i<=n; i++)
            if(D[i]!=d[i])
                ok=0;
        if(ok)
            out<<"DA\n";
        else
            out<<"NU\n";
    }
    return 0;
}