Cod sursa(job #102320)

Utilizator scvalexAlexandru Scvortov scvalex Data 14 noiembrie 2007 11:38:28
Problema Zvon Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

class Nod {
public:
	Nod(int _n) :
		n(_n),
		p(0) {
	}
	
	int n, p;
	vector< Nod * > c;
};

int n;
vector<Nod> noduri;

void calculeaza_prioritati(Nod *n) {
	int p(0);
	
	for (int i(0); i < (int)n->c.size(); ++i) {
		calculeaza_prioritati(n->c[i]);
		p += n->c[i]->p;
	}
	p += n->c.size();
	
	n->p = p;
}

int main(int argc, char *argv[]) {
	ifstream fin("zvon.in");
	int T;
	fin >> T;
	
	ofstream fout("zvon.out");
	for (int t(0); t < T; ++t) {
		fin >> n;
		noduri.clear();
		for (int i(0); i < n; ++i)
			noduri.push_back(Nod(i + 1));
		int a, b;
		for (int i(0); i < n - 1; ++i) {
			fin >> a >> b;
			noduri[a - 1].c.push_back(&noduri[b - 1]);
		}
		
		calculeaza_prioritati(&noduri[0]);
		
		//for (int i(0); i < (int)noduri.size(); ++i)
		//	cout << i << ": " << noduri[i].p << endl;
		
		vector< Nod* > cur;
		vector<bool> vizitat(n, false);
		int vizitate(1);
		int t(0);
		cur.push_back(&noduri[0]);
		while (vizitate < n) {
			//cout << "T=" << t << ": " << endl;
			int temp = cur.size();
			for (int i(0); i < temp; ++i) {
				int max(-1);
				for (int j(0); j < (int)cur[i]->c.size(); ++j)
					if ((!vizitat[cur[i]->c[j]->n]) && ((max == -1) || (cur[i]->c[j]->p > cur[i]->c[max]->p)))
						max = j;
				if (max != -1) {
					vizitat[cur[i]->c[max]->n] = true;
					//cout << "Vizitez: " << cur[i]->c[max]->n << endl;
					++vizitate;
					cur.push_back(cur[i]->c[max]);
				}
			}
			++t;
		}
		fout << t << endl;
	}
	fout.close();
	
	fin.close();
	
	return 0;
}