Pagini recente » Cod sursa (job #565034) | Cod sursa (job #625701) | Cod sursa (job #2154411) | Cod sursa (job #2888108) | Cod sursa (job #67493)
Cod sursa(job #67493)
#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;}