Cod sursa(job #569679)

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

using namespace std;
vector <int>b[20000];
int minim,x[15000],ga,muz,t,n,m;
unsigned char viz[15000],a[15000][15000]; 
	queue <int>c;
int parcurg(int i)
{

	c.push(i);
	viz[i]=1;
	int l=1,j,k=1;
	//v[k][l]=i;
	//l++;
	while(c.size()>0)
	{
		for(j=1;j<=n;j++)
			if((a[c.front()][j]==1)&&(viz[j]==0))
			{
				c.push(j);
				viz[j]=1;
			//	if(muz==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;
 if (x[k-1]==muz)
   {nr=0;
	for(int fi=1;fi<k-1;fi++)
		if(a[x[fi]][x[fi+1]]==0)
			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=32000;
	for(i=1;i<=m;i++)
	{
		f>>i1>>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;
}