Cod sursa(job #67763)

Utilizator stef2nStefan Istrate stef2n Data 25 iunie 2007 13:57:25
Problema Obiective Scor 15
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.63 kb
#include<cstdio>

#define NMAX 32001
#define INF 33000
struct NOD {int x,c; NOD *adr;};

int N;
NOD *prim[NMAX];
int cost[NMAX],vizitat[NMAX];
int C[1000][1000];

void adaug_st(NOD *(&prim), int x , int cost)
  {
   NOD *a=new NOD;
   a->x=x;
   a->c=cost;
   a->adr=prim;
   prim=a;
  }


void read_data()
  {
   int m,u,v;
   scanf("%d %d",&N,&m);
   for(int i=1;i<=N;i++)
      prim[i]=NULL;
   for(int i=1;i<=N;i++)
      for(int j=1;j<=N;j++)
         C[i][j]=INF;
   for(int i=0;i<m;i++)
      {
       scanf("%d %d",&u,&v);
       C[u][v]=0;
       C[v][u]=1;
       adaug_st(prim[u],v,0);
       adaug_st(prim[v],u,1);
      }
  }


int djk(int u, int v)
  {
   int i;
   for(i=1;i<=N;i++)
      {cost[i]=INF;
       vizitat[i]=0;}
   NOD *b=prim[u];
   while(b)
        {
         cost[b->x]=b->c;
         b=b->adr;
        }
   vizitat[u]=1;
   for(int j=0;j<N-1;j++)
      {
       int min=INF,poz=-1;
       for(i=1;i<=N;i++)
          if(!vizitat[i] && min>cost[i])
            {
             min=cost[i];
             poz=i;
            }
       if(poz==v)
         return cost[v];
       vizitat[poz]=1;
       NOD *b=prim[poz];
       while(b)
            {
             if(cost[b->x]>min+C[poz][b->x])
               cost[b->x]=min+C[poz][b->x];
             b=b->adr;
            }
      }
   return cost[v];
  }


int main()
{

freopen("obiective.in","r",stdin);
freopen("obiective.out","w",stdout);

read_data();
int t;
scanf("%d",&t);
for(int i=0;i<t;i++)
   {
    int u,v;
    scanf("%d %d",&u,&v);
    printf("%d\n",djk(u,v));
   }

return 0;
}