Cod sursa(job #1909574)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 7 martie 2017 13:08:26
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include<vector>
#include<algorithm>
using namespace std;

int n,m,nh,T,S,ok;
int d[50003],dist[50003],poz[50003],heap[50003];
vector<pair<int,int> >graf[50003];

void sw(int x, int y)
{
    swap(heap[x],heap[y]);
    poz[heap[x]]=x;
    poz[heap[y]]=y;
}




void heap_up(int k)
{
    if(k<=1)
        return;
    int t=k/2;
    if(dist[heap[t]]>dist[heap[k]])
    {
        sw(t,k);
        heap_up(t);
    }
}


void heap_down(int k)
{
    int f=2*k;

    if(f<=nh)
    {
        if(f+1<=nh&&dist[heap[f+1]]<dist[heap[f]])
            f++;
        if(dist[heap[f]]<dist[heap[k]])
        {
            sw(f,k);
            heap_down(f);
        }
    }


}


int inser()
{
    sw(1,nh);
    poz[heap[nh]]=0;
    nh--;
    return heap[nh+1];

}

void dij(int nod)
{
    for(int i=1;i<=n;i++)
        dist[i]=2147483647,poz[i]=heap[i]=i;
    dist[nod]=0;
    nh=n;
    while(nh)
    {
        nod=inser();
        heap_down(1);
        for(int i=0;i<graf[nod].size();i++)
            if(dist[graf[nod][i].first]>dist[nod]+graf[nod][i].second&&poz[graf[nod][i].first])
        {
            dist[graf[nod][i].first]=dist[nod]+graf[nod][i].second;
            heap_up(poz[graf[nod][i].first]);
        }
    }

}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&S);
        for(int i=1;i<=n;i++)
            scanf("%d",&d[i]);
        for(int i=1,x,y,z;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            graf[x].push_back(make_pair(y,z));
            graf[y].push_back(make_pair(x,z));
        }
        dij(S);
        ok=1;
        for(int i=1;i<=n&&ok;i++)
            if(dist[i]!=d[i])
        {
            printf("NU\n");
            ok=0;
        }
        if(ok)
            printf("DA\n");
        for(int i=0;i<=50003;i++)
        {
            if(!graf[i].empty())
                graf[i].clear();
        }


    }
    return 0;
}