Cod sursa(job #8924)

Utilizator rusRus Sergiu rus Data 25 ianuarie 2007 22:47:10
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include<stdio.h>
#include<iomanip.h>
#define dim 50001

typedef struct nod{
        int info,cost;
        nod*urm;
        }*pnod,NOD;
pnod l[dim];
int n,m,s;
int t;
int v[dim];
int d[dim],tata[dim],sel[dim];
void citire();
void add(int ,int ,int );
void dijkstra(int nod);

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    
    citire();
    //dijkstra();
    return 0;
}
void citire()
{
     int i,j,k,x,y,cost,start;
     scanf("%d",&t);
     for(i=1;i<=t;i++)
     {
                      scanf("%d %d %d",&n,&m,&start);
                      for(j=1;j<=n;j++)
                      scanf("%d",&v[j]);
                      for(k=1;k<=m;k++)
                      {
                                       scanf("%d %d %d",&x,&y,&cost);
                                       add(x,y,cost);
                                       //add(y,x,cost);
                      }
                      dijkstra(start);
     }
                                       
     //for(pnod p=l[1];p;p=p->urm)
     //printf("%d ",p->info);
}
     
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,min,pas,k,nr=0;
     memset(sel,0,sizeof(sel));
     memset(d,0,sizeof(d));
     memset(tata,0,sizeof(tata));
     for(i=1;i<=n;i++)
     d[i]=32000;
     for(pnod p=l[nod];p;p=p->urm)
     {
              d[p->info]=p->cost;
              tata[p->info]=nod;
     }
     d[nod]=0;
     for(i=1;i<=n;i++)
     {
                      min=2000000;
                      for(j=1;j<=n;j++)
                      if(!sel[j] && d[j]<min)
                      {        
                               min=d[j];
                               k=j;
                      }
                      sel[k]=1;
                      for(pnod p=l[k];p;p=p->urm)
                      if((!sel[p->info]) && (d[p->info]>d[k]+p->cost))
                      {
                                       sel[p->info]=1;
                                       d[p->info]=d[k]+p->cost;
                      } 
     }
     for(i=1;i<=n;i++)
     if(v[i]==d[i])
     nr++;
     if(nr==n)
     printf("DA\n");
     else
     printf("NU\n");
     //intf("%d ",d[i]);
}