Pagini recente » Cod sursa (job #1931500) | Cod sursa (job #644128) | Cod sursa (job #3185530) | Cod sursa (job #2571955) | Cod sursa (job #728250)
Cod sursa(job #728250)
#include <fstream>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
const int N=32005;
int comp[N],depth[N],n,nr;
bool use[N];
vector<int> a[N],adj[N],trans[N];
stack<int> S;
ifstream in("obiective.in");
ofstream out("obiective.out");
inline int max(int a,int b)
{
return a>b ? a : b;
}
void add(vector<int> &a,vector<int> &b)
{
for (vector<int>::iterator i=b.begin();i!=b.end();i++)
if (comp[*i]!=nr)
a.push_back(*i);
}
void dfs(stack<int> &S,int x)
{
use[x]=true;
for (vector<int>::iterator i=adj[x].begin();i!=adj[x].end();i++)
if (!use[*i])
dfs(S,*i);
S.push(x);
}
void dfs(int x)
{
use[x]=true;
comp[x]=nr;
for (vector<int>::iterator i=trans[x].begin();i!=trans[x].end();i++)
if (!use[*i])
dfs(*i);
add(a[nr],adj[x]);
}
void edit(vector<int>& a)
{
for (vector<int>::iterator i=a.begin();i!=a.end();i++)
(*i)=comp[*i];
}
void mark(vector<int> &a)
{
for (vector<int>::iterator i=a.begin();i!=a.end();i++)
use[*i]=true;
}
int ctc()
{
int x;
for (int i=1;i<=n;i++)
if (!use[i])
dfs(S,i);
memset(use,false,sizeof(use));
while (!S.empty())
{
x=S.top();
S.pop();
if (!use[x])
{
++nr;
dfs(x);
}
}
for (int i=1;i<=nr;i++)
edit(a[i]);
memset(use,false,sizeof(use));
for (int i=1;i<=nr;i++)
mark(a[i]);
for (int i=1;i<=nr;i++)
if (!use[i])
return i;
return 0;
}
void dfs(int x,int D)
{
use[x]=true;
depth[x]=D;
for (vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
if (!use[*i])
dfs(*i,D+1);
}
int main()
{
int m,x,y;
in>>n>>m;
while (m--)
{
in>>x>>y;
adj[x].push_back(y);
trans[y].push_back(x);
}
x=ctc();
memset(use,false,sizeof(use));
dfs(x,0);
in>>m;
while (m--)
{
in>>x>>y;
out<<max(depth[comp[x]]-depth[comp[y]],0)<<"\n";
}
return 0;
}