Cod sursa(job #1833340)

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

using namespace std;

const int N_max=100001;
const int T_max=11;

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

struct poz
{
    int nod,lungime;
};

struct poz1
{
    int nod1,cost1;
    poz1 *urm;
}*muchii[N_max][T_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,int test)
{
    poz1 *p;
    p=new poz1;
    p->nod1=b;
    p->cost1=c;

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

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

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

        scanf("%d %d %d\n",&n,&m,&S);

        for (int i=1;i<=n;i++)
        {
            scanf("%d ",&v[i][test]);
            if (i!=S)
            dist[i][test]=-1;
            else dist[i][test]=0;
        }

        for (int i=1;i<=m;i++)
        {
            int a=0,b=0,c=0;
            scanf("%d %d %d\n",&a,&b,&c);

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

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

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

                if (op1.lungime != v[op1.nod][test])
                {
                    adevarat=0;
                    while (!pq.empty()) pq.pop();
                }
                else
                    adauga_in_heap(op1.nod,op1.lungime,test);
            }
        }
        else adevarat=0;

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