Cod sursa(job #388044)

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