Pagini recente » Cod sursa (job #73598) | Cod sursa (job #228038) | Cod sursa (job #1985040) | Cod sursa (job #2026067) | Cod sursa (job #67749)
Cod sursa(job #67749)
#include <stdio.h>
#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;
}