Pagini recente » Cod sursa (job #370185) | Cod sursa (job #2924647) | Cod sursa (job #1354388) | Cod sursa (job #351171) | Cod sursa (job #500954)
Cod sursa(job #500954)
#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;
}