Cod sursa(job #1321944)

Utilizator sicsicFMI-Coteanu Vlad sicsic Data 19 ianuarie 2015 18:13:09
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>
#include<string.h>
using namespace std;
int i,T,n,m,s,D[50001],V[50001],U[50001],inf=5000000;
struct lista {int nod,cost;
              lista *leg;
             }*G[50001];
void adaug(int i,int j,int c)
{
    lista *p;
    p=new lista;
    p->nod=j;
    p->cost=c;
    p->leg=G[i];
    G[i]=p;
}
void citire()
{
    scanf("%d %d %d", &n,&m,&s);
    int i,j,c;
    for(i=1;i<=n;++i) scanf("%d", &V[i]);
    while(m--)
    {
        scanf("%d %d %d", &i,&j,&c);
        adaug(i,j,c);
    }
}
void Dantzig(int start)
{
    int nod,mini,i;
    for(i=1;i<=n;++i) D[i]=inf;
    memset(U,0,sizeof U);
    D[start]=0;
    while(1)
    {
        mini=inf;
        for(i=1;i<=n;++i)
            if(!U[i]&&mini>D[i]) mini=D[i],nod=i;
        if(mini==inf) break;
       // printf("%d \n", nod);
        U[nod]=1;
        lista *p;
        for(p=G[nod];p;p=p->leg)
          {
              //printf("%d %d \n", p->nod,p->cost);
              if(D[p->nod]>D[nod]+p->cost)
                {
                    D[p->nod]=D[nod]+p->cost;
                }
          }
    }
    int ok=1;
   /* for(i=1;i<=n;++i) printf("%d ", D[i]);
    printf("\n");*/
    for(i=1;i<=n&&ok;++i) if(V[i]!=D[i]) ok=0;
    if(ok) printf("DA \n");
    else printf("NU \n");
}
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d", &T);
    for(i=1;i<=T;++i)
     {
         citire();
         Dantzig(s);
     }
    return 0;
}