Pagini recente » Cod sursa (job #721981) | Cod sursa (job #3237262) | Cod sursa (job #1709196) | Cod sursa (job #2889061) | Cod sursa (job #2314945)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("obiective.in");
ofstream fout("obiective.out");
const int NMAX=32005;
vector <int> Ad[NMAX],Add[NMAX],Ad2[NMAX],Add2[NMAX];
vector <vector <int> > mama;
vector <int> S,S2;
int viz[NMAX],viz2[NMAX],comp[NMAX],cost[NMAX],viz3[NMAX];
int n,m,nr,C,ct,minim;
void dfs1(int u)
{
int w;
viz[u]=1;
for(int i=0;i<Ad[u].size();++i)
{
w=Ad[u][i];
if(viz[w]==0) dfs1(w);
}
S.push_back(u);
}
void DO1()
{
for(int i=1;i<=n;++i)
if(viz[i]==0) dfs1(i);
}
void dfs2(int u, int nr)
{
viz2[u]=1;
int w;
comp[u]=nr;
for(int i=0;i<Add[u].size();++i)
{
w=Add[u][i];
if(viz2[w]==0) dfs2(w,nr);
}
}
void DO2()
{
for(int i=S.size()-1;i>=0;--i)
if(viz2[S[i]]==0)
{
nr++;
dfs2(S[i],nr);
}
}
void read()
{
int x,y;
fin>>n>>m;
for(int i=1;i<=m;++i)
{
fin>>x>>y;
Ad[x].push_back(y);
Add[y].push_back(x);
}
DO1();
DO2();
}
void ceva()
{
int w;
for(int i=1;i<=n;++i)
{
for(int j=0;j<Ad[i].size();++j)
{
w=Ad[i][j];
if(comp[w]!=comp[i])
{
Ad2[comp[i]].push_back(comp[w]);
Add2[comp[w]].push_back(comp[i]);
}
}
}
}
void bfs(int u, int cost)
{
if(comp[u]==C) {if(cost<minim) minim=cost;}
else
{
int w;
viz3[u]=1;
for(int i=0;i<Ad2[u].size();++i)
{
w=Ad2[u][i];
if(viz3[w]==0) bfs(w,cost);
viz3[w]=0;
}
for(int i=0;i<Add2[u].size();++i)
{
w=Add2[u][i];
if(viz3[w]==0) bfs(w,cost+1);
viz3[w]=0;
}
}
}
void solve()
{
int s,f,x,y;
fin>>ct;
for(int i=1;i<=ct;++i)
{
fin>>s>>f;
C=comp[f];
minim=1000000000;
bfs(comp[s],0);
fout<<minim<<"\n";
}
}
int main()
{
read();
ceva();
solve();
return 0;
}