Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/matteus | Istoria paginii utilizator/m_mihai92 | Sandbox | Cod sursa (job #388045)
Cod sursa(job #388045)
#include<cstdio>
#define N 32001
#include<vector>
#include<bitset>
#define minn(a,b) ((a<b)? (a):(b))
#define pb push_back
using namespace std;
vector<short int >dep,low,a[N],g[N];
short int x,y,st[N],lev,rez,nod[N];
int n,m;
bitset<N>viz,b[N];
bool ok;
void df(int n)
{
dep[n]=low[n]=lev;
st[++st[0]]=n;
viz[n]=1;
++lev;
size_t g=a[n].size();
for(size_t i=0; i<g; ++i)
if (dep[a[n][i]]==-1)
{
df(a[n][i]);
low[n]=minn(low[n],low[a[n][i]]);
}
else
if (viz[n])
low[n]=minn(low[n],low[a[n][i]]);
if (low[n]==dep[n])
{
int nod1;
do
{
nod1=st[st[0]--];
viz[nod1]=0;
nod[nod1]=n;
}
while (nod1!=n);
}
}
void df(int n,int dm)
{
viz[n]=1;
if (n==y)
{
rez=dm;
ok=true;
return;
}
if (ok)
return;
size_t h=g[n].size();
for (size_t i=0; i<h; ++i)
{
if (viz[nod[g[n][i]]])
continue;
df(nod[g[n][i]],dm+(1^b[n][g[n][i]]));
if (ok)
return;
}
}
void citire()
{
freopen("obiective.in","r",stdin);
freopen("obiective.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1; i<=m; ++i)
{
scanf("%hd%hd",&x,&y);
a[x].pb(y);
if (b[x][y]==0)
b[x][y]=1;
g[x].pb(y);
g[y].pb(x);
}
for (int i=1; i<=n; ++i)
{
dep[i]=-1;
nod[i]=i;
}
for (int i=1; i<=n; ++i)
if (dep[i]==-1)
df(i);
int t;
scanf("%d",&t);
viz.reset();
while (t--)
{
scanf("%hd%hd",&x,&y);
if (nod[x]==nod[y])
{
printf("0\n");
continue;
}
df(nod[x],0);
printf("%d\n",rez);
viz.reset();
ok=false;
}
}
int main()
{
citire();
return 0;
}