Cod sursa(job #388099)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 29 ianuarie 2010 12:46:55
Problema Obiective Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#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>a[N],g[N];
short int x,y,st[N],lev,rez,nod[N],dep[N],low[N];
int n,m;
bool viz[N],b[N][N];
bool ok;
void df1(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)
		{
			df1(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==nod[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 res()
{
	for (int i=1;i<=n; ++i)
		viz[i]=0;
}
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)
			df1(i);
	int t;
	scanf("%d",&t);
	res();
	while (t--)
	{
		scanf("%hd%hd",&x,&y);
		if (nod[x]==nod[y])
		{
			printf("0\n");
			continue;
		}
		df(nod[x],0);
		printf("%d\n",rez);
		res();
		rez=0;
		ok=false;
	}
}
int main()
{
	citire();
	return 0;
}