Cod sursa(job #794136)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 5 octombrie 2012 18:42:56
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb

#include <cstdio>

const int MAX_SIZE(100001);

struct edge
{
	int vertex;
	struct edge *next;
} *graph [MAX_SIZE];

int k [MAX_SIZE];
int monkeys [MAX_SIZE];
bool mark [MAX_SIZE];

int n;

inline void read (void)
{
	std::freopen("cerere.in","r",stdin);
	std::scanf("%d",&n);
	for (int *iterator(k + 1), *end(k + n) ; iterator <= end ; ++iterator)
		std::scanf("%d",iterator);
	int a, *a_ptr(&a), b, *b_ptr(&b);
	struct edge *new_edge;
	for (int i(0) ; i < n ; ++i)
	{
		std::scanf("%d%d",a_ptr,b_ptr);
		new_edge = new struct edge;
		new_edge->vertex = b;
		new_edge->next = graph[a];
		graph[a] = new_edge;
	}
	std::fclose(stdin);
}

void DepthFirstSearch (int node, int depth)
{
	if (k[node] && depth)
	{
		monkeys[node] = depth / k[node];
		if (depth % k[node])
			++monkeys[node];
	}
	for (struct edge *iterator(graph[node]) ; iterator ; iterator = iterator->next)
	{
		if (mark[iterator->vertex])
			continue;
		mark[iterator->vertex] = true;
		if (k[iterator->vertex])
			DepthFirstSearch(iterator->vertex,depth + 1);
		else
			DepthFirstSearch(iterator->vertex,0);
	}
}

inline void print (void)
{
	std::freopen("cerere.out","w",stdout);
	for (int *iterator(monkeys + 1), *end(monkeys + n) ; iterator <= end ; ++iterator)
		std::printf("%d ",*iterator);
	std::putchar('\n');
	std::fclose(stdout);
}

int main (void)
{
	read();
	DepthFirstSearch(1,0);
	print();
	return 0;
}