Cod sursa(job #67493)

Utilizator razvi9Jurca Razvan razvi9 Data 25 iunie 2007 10:31:12
Problema Obiective Scor 15
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.43 kb
#include<stdio.h>
#include<string.h>
typedef struct {int x,y;}nod;
int viz[32001],nr,f[32001],m,n,t,min;
nod *a;
int **b;

void DF(int vf)
{viz[vf]=1;
 for(int i=1;i<=m;i++)
  if(a[i].x==vf && !viz[a[i].y]) DF(a[i].y);
 f[++nr]=vf;}

void DF2(int vf)
{viz[vf]=nr;
 for(int i=1;i<=m;i++)
  if(a[i].y==vf && !viz[a[i].x]) DF2(a[i].x);}

void CompBiconexe()
{for(int i=1;i<=n;i++)
  if(!viz[i]) DF(i);
 memset(viz,0,sizeof(viz));
 nr=0;
 for(int i=n;i>=1;i--)
  if(!viz[f[i]]) {nr++;DF2(f[i]);}}

void df(int vf,int vf2,int d)
{if(vf==vf2)
 {if(min>d) min=d;
  return;}
 if(d>=min) return;
 f[vf]=1;
 for(int i=1;i<=nr;i++)
  if(b[vf][i])
   {if(!f[i]) df(i,vf2,d);}
  else if(b[i][vf] && !f[i])
        df(i,vf2,d+1);
 f[vf]=0;}

int main()
{freopen("obiective.in","r",stdin);
 freopen("obiective.out","w",stdout);
 scanf("%d %d",&n,&m);
 const int M=m;
 a= new nod[M+1];
 for(int i=1;i<=m;i++)  scanf("%d %d",&a[i].x,&a[i].y);
 CompBiconexe();
 const int N=nr;
 b=new int*[N+1];
 for(int i=1;i<=N;i++)
 { b[i]=new int[N+1];
  for(int j=1;j<=N;j++)
   b[i][j]=0;
  b[i][i]=1;}
 for(int i=1;i<=m;i++)
  b[viz[a[i].x]][viz[a[i].y]]=1;
 delete []a;
 scanf("%d",&t);
 int x,y;
 memset(f,0,sizeof(f));
 for(int i=1;i<=t;i++)
 {scanf("%d %d",&x,&y);
  x=viz[x];
  y=viz[y];
  if(x==y||b[x][y]) {printf("0\n");continue;}
  min=32767;
  df(x,y,0);
  printf("%d\n",min);
 }

 fclose(stdout);
 return 0;}