Cod sursa(job #569684)

Utilizator mionelIon. M mionel Data 1 aprilie 2011 23:29:26
Problema Obiective Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<queue>
#include<vector>

using namespace std;
vector <int>b[30000],a[30000];
int minim,x[30000],ga,muz,t,n,m;
unsigned char viz[30000]; 

int parcurg(int i)
{
	queue <int>c;
	int nd;
	c.push(i);
	viz[i]=1;
	int l=1,j,k=1;
	//v[k][l]=i;
	//l++;
	while(c.size()>0)
	{
		nd=c.front();
		for(j=0;j<a[nd].size();j++)
			if((viz[a[nd][j]]==0))
			{
				c.push(a[nd][j]);
				viz[a[nd][j]]=1;
				if(muz==a[nd][j])
					 return 1;
		//		v[k][l++]=j;
			}
		k++;
		c.pop();
		//l=1;
	}
	//lung=k-1;
}

int  Validare(int k)
{ int i,ok;
  
  for(i=1;i<=k-1;i++)
    if (x[i]==x[k])
	return 0;
return 1;
}
void Back(int k,int j)
{
 int i,nr,l;
 if (x[k-1]==muz)
   {nr=0;
	for(int fi=1;fi<k-1;fi++)
		{ int ok=1;
		for(l=0;l<a[x[fi]].size();l++)
			if(a[x[fi]][l]==x[fi+1])
				ok=0;
		if(ok==1)	nr++;
		}
	if(nr<minim)
		minim=nr;
	//cout<<nr;
	}
   else
    for(i=0;i<b[x[k-1]].size();i++)
    {
       x[k]=b[x[k-1]][i];
       if (Validare(k)==1)
	       Back(k+1,j);
    }
}

int main()
{
	ifstream f("obiective.in");
	f>>n>>m;
	ofstream g("obiective.out");
	int i,k,i1,j1,j;
		minim=100000;
	for(i=1;i<=m;i++)
	{
		f>>i1>>j1;
		a[i1].push_back(j1);
		//a[i1][j1]=1;
		b[i1].push_back(j1);
		b[j1].push_back(i1);
	}
	f>>t;
	
for(j=1;j<=t;j++)
{
	f>>ga>>muz;
	parcurg(ga);
	k=2;
	minim=100000;
	x[1]=ga;
	if(viz[muz]==0)
	{
		Back(2,j);
		g<<minim<<endl;
		
	}
	else g<<0<<endl;
	memset(viz,0,n);
}
return 0;
}