Pagini recente » Cod sursa (job #3143621) | Cod sursa (job #607677) | Cod sursa (job #239308) | Cod sursa (job #571976) | Cod sursa (job #67789)
Cod sursa(job #67789)
#include <stdio.h>
#include <string>
#include <vector>
using namespace std;
#define maxn 32010
#define pb push_back
#define maxx 100010
int n,m,l,k;
vector <short> a[maxn];
vector <int> b[maxn];
vector <char> c[maxn];
int g[maxn];
short px[maxx],py[maxx],sol[maxx];
int s[maxn],v[maxn];
char used[maxn];
short cost[maxn];
void BFS(int nod)
{
memset(used,0,sizeof(used));
int i,j;
for (i=1;i<=n;++i) cost[i]=maxn;
cost[nod]=0;
l=1;
k=0;
s[l]=nod;
used[nod]=1;
while (l>0)
{
for (i=1;i<=l;++i)
for (j=0;j<g[s[i]];++j)
{
if ((c[s[i]][j]==0) && (used[a[s[i]][j]]!=1))
{
s[++l]=a[s[i]][j];
used[s[l]]=1;
cost[s[l]]=cost[s[i]];
}
if ((c[s[i]][j]==1) && (used[a[s[i]][j]]==0))
{
v[++k]=a[s[i]][j];
used[v[k]]=2;
cost[v[k]]=cost[s[i]]+1;
}
}
l=0;
for (i=1;i<=k;++i)
if (used[v[i]]!=1)
{
s[++l]=v[i];
used[s[l]]=1;
}
}
}
int main()
{
freopen("obiective.in","r",stdin);
freopen("obiective.out","w",stdout);
scanf("%d %d ",&n,&m);
int i,x,y,aux,j;
for (i=1;i<=m;++i)
{
scanf("%d %d ",&x,&y);
a[x].pb(y);
a[y].pb(x);
c[x].pb(0);
c[y].pb(1);
}
for (i=1;i<=n;++i) g[i]=a[i].size();
scanf("%d ",&m);
for (i=1;i<=m;++i)
{
scanf("%d %d ",&px[i],&py[i]);
b[px[i]].pb(i);
}
for (i=1;i<=n;++i)
{
aux=b[i].size();
if (aux>0)
{
BFS(i);
for (j=0;j<aux;++j) sol[b[i][j]]=cost[py[b[i][j]]];
}
}
for (i=1;i<=m;++i) printf("%d\n",sol[i]);
return 0;
}