Cod sursa(job #1110155)

Utilizator Eugen_VlasieFMI Vlasie Eugen Eugen_Vlasie Data 17 februarie 2014 21:02:17
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector<pair<int,int> > a[50010];
pair<int,int> per,heap[250010];
int nod1,d1,nod2,d2,elheap,ok[50010],sol[50010],con,t,x,y,z,dist[50010],n,m,i,j,s;
void addh(pair<int,int> p)
{
    int ch=elheap;
    heap[elheap]=p;
    while(heap[ch].first<heap[ch/2].first)
    {
        swap(heap[ch],heap[ch/2]);
        ch/=2;
    }
}
void delh()
{
    int el,ch=elheap;
    heap[1]=heap[ch];
    z=ch;
    ch=1;
    if(elheap==1)
        heap[1].first=0,heap[1].second=0;
    while(heap[ch].first>heap[ch*2].first||heap[ch].first>heap[ch*2+1].first)
    {
        if(ch*2+1<elheap&&heap[ch*2+1].first<heap[ch*2].first)
            z=ch*2+1;
        if(ch*2<elheap&&heap[ch*2].first<heap[ch*2+1].first)
            z=ch*2;
        if(z==ch)
            return;
        swap(heap[ch],heap[z]);
        ch=z;
    }
}
int main()
{
    f>>t;
    heap[0].first=-300000005;
    for(con=1;con<=t;con++)
    {
        f>>n>>m>>s;
        for(i=1;i<=n;i++)
        {
            f>>sol[i];
            a[i].erase(a[i].begin(),a[i].end());
            ok[i]=0;
            dist[i]=300000000;
        }
        for(i=1;i<=m;i++)
        {
            f>>x>>y>>z;
            a[x].push_back(pair<int,int>(z,y));
            a[y].push_back(pair<int,int>(z,x));
        }
        elheap=1;
        dist[s]=0;
        heap[1]=pair<int,int>(0,s);
        while(elheap)
        {
            nod1=heap[1].second;
            d1=heap[1].first;
            delh();
            elheap--;
            if(!ok[nod1]&&dist[nod1]>=d1)
            {
                ok[nod1]++;
                for(vector<pair<int,int> >::iterator it=a[nod1].begin();it!=a[nod1].end();it++)
                {
                    per=*it;
                    d2=per.first;
                    nod2=per.second;
                    if(dist[nod2]>dist[nod1]+d2)
                    {
                        dist[nod2]=dist[nod1]+d2;
                        elheap++;
                        addh(pair<int,int>(dist[nod2],nod2));
                    }
                }
            }
        }
        y=0;
        for(i=1;i<=n&&!y;i++)
        {
            if(dist[i]==300000000)
                dist[i]=-1;
            if(dist[i]!=sol[i]&&i!=s)
            {
                y=1;
                g<<"NU\n";
            }
        }
        if(!y)
            g<<"DA\n";
    }
    return 0;
}