Cod sursa(job #1833315)

Utilizator NicusorTelescu Nicolae Nicusor Data 22 decembrie 2016 09:28:55
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.99 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const int N_max=100001;

char s[200];
int v[N_max],dist[N_max];
bool adevarat=1;

struct poz
{
    int nod,lungime;
};

struct poz1
{
    int nod1,cost1;
    poz1 *urm;
}*muchii[N_max];

struct cmp
{
    bool operator () (const poz &a,const poz &b)
    {
        return a.lungime>b.lungime;
    }
};

priority_queue < poz , vector <poz> , cmp > pq;

void adauga(int a,int b,int c)
{
    poz1 *p;
    p=new poz1;
    p->nod1=b;
    p->cost1=c;

    if (muchii[a]==NULL)
        p->urm=NULL, muchii[a]=p;
    else p->urm=muchii[a], muchii[a]=p;
}

void sterge(int a,int b)
{
    poz1 *p,*p1;
    p=muchii[a];
    p1=muchii[a]->urm;
    if (p->nod1==b)
    {
        muchii[a]=p1;
        delete p;
    }
    else while (p1)
    {
        if (p1->nod1==b)
        {
            p->urm=p1->urm;
            delete p1;
            break;
        }
        else p=p->urm, p1=p1->urm;
    }
}

void adauga_in_heap(int a,int b)
{
    poz1 *p,*p1;
    p=muchii[a];
    if (p!=0)
    {
        p1=muchii[a]->urm;
        while (p1)
        {
            if (dist[p->nod1]==-1)
            {
                dist[p->nod1]=p->cost1+b;
                pq.push({p->nod1,p->cost1+b});
            }
            sterge(p->nod1,a);
            delete p;
            p=p1;
            p1=p1->urm;
        }
        if (dist[p->nod1]==-1)
        {
            dist[p->nod1]=p->cost1+b;
            pq.push({p->nod1,p->cost1+b});
            sterge(p->nod1,a);
            delete p;
        }
    }
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    int T;
    scanf("%d\n",&T);
    for (int k=1;k<=T;k++)
    {
        int n=0,m=0,S=0;
        char op=0;
        gets(s);

        adevarat=1;

        for (int i=0;s[i]!=0;i++)
        {
            if (s[i]==' ') op++;
            else
                if (op==0) n=n*10+s[i]-'0';
                else if (op==1) m=m*10+s[i]-'0';
                else if (op==2) S=S*10+s[i]-'0';
        }

        gets(s);
        op=1;
        v[1]=0;
        for (int i=0;s[i]!=0;i++)
        {
            if (s[i]==' ') op++, v[op]=0;
            else v[op]=v[op]*10+s[i]-'0';

            if (i>0 && i<n+1 && i!=S)
                dist[i]=-1;
            else if (i==S) dist[S]=0;
        }

        for (int i=1;i<=m;i++)
        {
            int a=0,b=0,c=0;
            gets(s);
            op=1;

            for (int j=0;s[j]!=0;j++)
            {
                if (s[j]==' ') op++;
                else if (op==1) a=a*10+s[j]-'0';
                else if (op==2) b=b*10+s[j]-'0';
                else if (op==3) c=c*10+s[j]-'0';
            }

            adauga(a,b,c);
            adauga(b,a,c);
        }

        if (v[S]==0)
        {
            adauga_in_heap(S,0);

            while (!pq.empty())
            {
                poz op1=pq.top();
                pq.pop();

                if (op1.lungime != v[op1.nod])
                {
                    adevarat=0;
                    while (!pq.empty()) pq.pop();
                }
                else
                    adauga_in_heap(op1.nod,op1.lungime);
            }
            for (int i=1;i<=n;i++)
            {
                if (muchii[i]!=0)
                {
                    /**poz1 *p,*p1;
                    p=muchii[i];
                    p1=muchii[i]->urm;
                    while (p1)
                    {
                        sterge(i,p->nod1);
                        sterge(p->nod1,i);
                        p=p1;
                        p1=p1->urm;
                    }
                    sterge(i,p->nod1);
                    sterge(p->nod1,i);*/

                    muchii[i]=NULL;
                }
            }
        }
        else adevarat=0;

        if (adevarat==1) printf("DA\n");
        else printf("NU\n");
    }
}