Cod sursa(job #1250304)

Utilizator cioionutFMI Ionut Ciocoiu cioionut Data 27 octombrie 2014 23:29:57
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;

vector <int> v[100001];
vector <int> arb[100001];
vector <int> viz(100001, 0);
vector <int> niv(100001, 0);
vector <int> sol(100001, 0);

void dfs(int top, int *a, int n)
{
	viz[top] = 1;
	n++;
	niv[n] = top;

	if (a[top] != 0) arb[niv[n - a[top]]].push_back(top);
	
	//if (a[top] != 0 && n - a[top] >= 0)
		//sol[top] = sol[niv[n - a[top]]] + 1;
	for (int i = 0; i < v[top].size(); i++)
	if (viz[v[top][i]] == 0)
		dfs(v[top][i], a, n);
	//for (int i = 0; i <= 12; i++) cout << niv[i] << " "; cout << "\n";
	niv[n] = 0;
}
void bfs(int x){

	queue <int> q;
	q.push(x);
	viz[x] = 1;
	while (!q.empty()){
		//cout << q.front() << " ";
		for (int i = 0; i < arb[q.front()].size(); i++)
		if (viz[arb[q.front()][i]] == 0) {
			q.push(arb[q.front()][i]);
			sol[arb[q.front()][i]] = sol[q.front()]+1;
			viz[arb[q.front()][i]] = 1;
		}
		q.pop();
	}
}
int main()
{

	ifstream f("cerere.in");
	ofstream g("cerere.out");
	int n, i, j;
	f >> n;
	int *a = new int[n + 1];
	for (i = 1; i <= n; i++) {
		f >> a[i];
	}
	while (!f.eof()) {
		f >> i >> j;
		v[i].push_back(j);
	}

	dfs(1, a, -1);
	/*
	for (i = 1; i <= n; i++){
		cout << i << ": ";
		for (j = 0; j < arb[i].size(); j++)
			cout << arb[i][j] << " ";
		cout << endl;
	}
	*/
	for (i = 0; i <= n; i++) viz[i] = 0;
	for (i = 1;i<=n;i++)
		if (a[i]==0) bfs(i);

	
	for (int i = 1; i <= n; i++)
		g << sol[i] << " ";
	
	//cin.get();
	f.close();
	g.close();
	return 0;
}