Cod sursa(job #1490279)

Utilizator vladttturcuman vlad vladtt Data 23 septembrie 2015 09:00:44
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>
#include <vector>
#include <cstring>
#define Max 1000000000
using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

struct heapuri
{
    int nod,lg;
} heap[100010],tmp;

int n,m,i,y,t,a[50010],dist[50010],x,lg,nod,s;

vector<heapuri> edge[100010];

void AddToHeap(int nod,int lg)
{
    int thislg=++heap[0].lg;
    int parent=thislg/2;
    while(lg<heap[parent].lg && parent>=1)
    {
        heap[thislg].lg=heap[parent].lg;
        heap[thislg].nod=heap[parent].nod;
        thislg=parent;
        parent=thislg/2;
    }


    heap[thislg].lg=lg;
    heap[thislg].nod=nod;
}


void RemoveFromHeap()
{
    heap[0].lg--;

    heap[1].lg=heap[heap[0].lg+1].lg;
    heap[heap[0].lg+1].lg=Max;
    heap[1].nod=heap[heap[0].lg+1].nod;



    int thislg=1;
    int child=thislg*2;

    while((heap[thislg].lg>heap[child].lg || heap[thislg].lg>heap[child+1].lg )&& child<=heap[0].lg)
    {
        if(heap[child].lg<heap[child+1].lg)
        {

            tmp.lg=heap[thislg].lg;
            tmp.nod=heap[thislg].nod;
            heap[thislg].lg=heap[child].lg;
            heap[thislg].nod=heap[child].nod;
            heap[child]=tmp;
            thislg=child;
            child=thislg*2;
        }
        else
        {


            tmp.lg=heap[thislg].lg;
            tmp.nod=heap[thislg].nod;
            heap[thislg].lg=heap[child+1].lg;
            heap[thislg].nod=heap[child+1].nod;
            heap[child+1]=tmp;

            thislg=child+1;
            child=thislg*2;
        }
    }

}

int main()
{

    fin>>t;
    for(y=1;y<=t;y++)
    {
        memset(heap,0,sizeof(heap));
        memset(dist,0,sizeof(dist));
        memset(edge,0,sizeof(edge));

        fin>>n>>m>>s;

        for(i=1;i<=n;i++)
            fin>>a[i];

        for(i=1;i<=m;i++)
        {
            fin>>x>>tmp.nod>>tmp.lg;

            edge[x].push_back(tmp);

            x+=tmp.nod - x + (tmp.nod=x);

            edge[x].push_back(tmp);

        }

        AddToHeap(1,0);

        while(heap[0].lg)
        {
            nod=heap[1].nod;
            lg=heap[1].lg;
            if(dist[nod]==0)
                dist[nod]=lg;

            for(i=0;i<edge[nod].size();i++)
                if(dist[edge[nod][i].nod]==0 && edge[nod][i].nod!=1)
                    AddToHeap(edge[nod][i].nod,lg+edge[nod][i].lg);
            RemoveFromHeap();
        }

        for(i=1;i<=n;i++)
            if(dist[i]!=a[i])
                break;
        if(i==n+1)
            fout<<"DA"<<'\n';
        else
            fout<<"NU"<<'\n';
    }

    return 0;
}