Cod sursa(job #500954)

Utilizator nautilusCohal Alexandru nautilus Data 13 noiembrie 2010 20:47:54
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<fstream>
#include<vector>
#define dmax 100010
using namespace std;

int n;
int a[dmax],tata[dmax],stramos[dmax],sol[dmax];
vector <int> b[dmax];
int stiva[dmax],sf;

void afisare()
{
 int i;
 
 ofstream fout("cerere.out");
 for (i=1; i<=n; i++)
	 fout<<sol[i]<<" ";
	
 fout.close();
}

void dfs(int k)
{
 int i;
	
 if (a[k]!=0)
	 stramos[k]=stiva[sf-a[k]];
 
 for (i=0; i<b[k].size(); i++)
	 {
	  sf++;
	  stiva[sf]=b[k][i];
	  dfs(b[k][i]);
	 }
 sf--;
}

int numar(int k)
{
 if (a[k]==0)
	 return 0; else
	 if (sol[stramos[k]]!=-1)
		 return (1+sol[stramos[k]]); else
		 return (1+numar(stramos[k]));
}

void solve()
{
 int i;
 
 for (i=1; i<=n; i++)
	 if (sol[i]==-1)
		 sol[i]=numar(i);	
}

void citire()
{
 int i,x,y;
	
 ifstream fin("cerere.in");
 fin>>n;
 for (i=1; i<=n; i++)
	 {
	  fin>>a[i];
	  sol[i]=-1;
	 }
 for (i=1; i<=n; i++)
	 {
	  fin>>x>>y;
	  tata[y]=x;
	  b[x].push_back(y);
	 }
 
 fin.close(); 
}

int main()
{
 int i;
 
 citire(); 
 
 for (i=1; i<=n; i++) /*caut radacina*/
	 if (tata[i]==0)
		 break;
 
 sf=1; stiva[1]=i;
 dfs(i);
 
 solve();
 
 afisare();
 
 return 0;
}