Cod sursa(job #382330)

Utilizator lorandCsorba Lorand-Alexandru lorand Data 13 ianuarie 2010 13:56:47
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
using namespace std;
#include<fstream>
struct nod
{
    int capat;
    int cost;
    nod* next;
};
nod* G[50005];
int T,N,M,S,D[50005],v[50005],d[50005];
void adauga(int,int,int);
void sterge();
int main()
{
    nod *p;
    int i,j,a,b,c,gata,pmin;
    ifstream fin("distante.in");
    fin>>T;
    ofstream fout("distante.out");
    for(i=1;i<=T;++i)
    {
        fin>>N>>M>>S;
        for(j=1;j<=N;++j)
           fin>>D[j];
        for(j=1;j<=M;++j)
        {
            fin>>a>>b>>c;
            adauga(a,b,c);
            adauga(b,a,c);
        }
        if(D[S])
          fout<<"NU\n";
        else
        {
            for(j=N;j>=0;--j)
            {
                v[j]=0;
                d[j]=200000000;
            }
            v[S]=1;
            d[S]=0;
            for(p=G[S];p;p=p->next)
               d[p->capat]=p->cost;
            while(gata==0)
            {
                pmin=0;
                for(j=1;j<=N;++j)
                   if(v[j]==0)
                     if(d[j]<d[pmin])
                       pmin=j;
                if(pmin==0)
                  gata=1;
                else
                {
                    v[pmin]=1;
                    for(p=G[pmin];p;p=p->next)
                       if(v[p->capat]==0)
                         if(d[p->capat]>d[pmin]+p->cost)
                           d[p->capat]=d[pmin]+p->cost;
                }
            }
            for(j=1;j<=N;++j)
               if(D[j]!=d[j])
                 break;
            if(j<=N)
              fout<<"NU\n";
            else
              fout<<"DA\n";
          }    
          sterge();    
    }  
    fin.close();
    fout.close();
    return 0;
}
void adauga(int a,int b,int c)
{
    nod *p=new nod;
    p->capat=b;
    p->cost=c;
    p->next=G[a];
    G[a]=p;
}
void sterge()
{
    nod *p,*q;
    int i;
    for(i=1;i<=N;++i)
       for(p=G[i];p;p=q)
       {
           q=p->next;
           delete p;
       }
    for(i=1;i<=N;++i)
       G[i]=NULL;
}