Cod sursa(job #28804)

Utilizator rusRus Sergiu rus Data 8 martie 2007 12:05:35
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include<stdio.h>
#include<iomanip.h>
#define dim 100001

typedef struct nod{
        int info,cost;
        nod*urm;
        }*pnod,NOD;
pnod l[dim];
int n,m,start;
int teste;
int d[dim],s[dim],t[dim];
int sir[dim];

void citire();
void add(int ,int ,int );
void dijkstra(int );

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    
    citire();

    return 0;
}
void citire()
{
     
     int i,j,x,y,cost;
     scanf("%d",&teste);
     for(int poz=1;poz<=teste;poz++)
     {
     memset(l,0,sizeof(l));        
     scanf("%d %d %d",&n,&m,&start);
     for(i=1;i<=n;i++)
      scanf("%d ",&sir[i]);
       for(j=1;j<=m;j++)
       {
                        scanf("%d %d %d",&x,&y,&cost);
                        add(x,y,cost);
                        add(y,x,cost);
       }
       
        dijkstra(start);
     }
}
void add(int i,int j,int cost)
{
     pnod p=new NOD;
     p->info=j;
     p->cost=cost;
     p->urm=l[i];
     l[i]=p;
}
void dijkstra(int nod)
{
     int i,j,pas,min,max,k,nr=0;
     max=-32000;
     memset(s,0,sizeof(s));
     memset(t,0,sizeof(t));
     memset(d,0,sizeof(d));
     
     for(i=1;i<=n;i++)
     {
                      d[i]=32000;
                      t[i]=0;
     }
     for(pnod p=l[nod];p;p=p->urm)
     {
              d[p->info]=p->cost;
              t[p->info]=nod;
     }
     d[nod]=0;
     s[nod]=1;
     
     for(pas=1;pas<n;pas++)
     {
                           min=32000;
                           for(i=1;i<=n;i++)
                           if(!s[i] && d[i]<min)
                           {
                                    min=d[i];
                                    k=i;
                           }
                           s[k]=1;
                           for(pnod p=l[k];p;p=p->urm)
                           if((!s[p->info]) &&( d[p->info]>d[k]+p->cost))
                           {
                                            d[p->info]=d[k]+p->cost;
                                            t[p->info]=k;
                                            s[p->info]=1;
                           }
     }
     for(i=1;i<=n;i++)
      if(d[i]==sir[i])
       nr++;
       if(nr==n) printf("DA\n");
       else
                 printf("NU\n");
                 
}