Cod sursa(job #1709613)

Utilizator DEFINEtelyEngineersUPB Pirtoaca Vasilescu Zamfiratos DEFINEtelyEngineers Data 28 mai 2016 13:04:48
Problema Revolta Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.39 kb
#include<fstream>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<math.h>
#include<string.h>
using namespace std;

#define NMAX 100001
#define INF ((1<<30) - 100)

vector <int> v[NMAX];
int d[NMAX],viz[NMAX],diam[NMAX],sol;

void dfs(int nod)
{
	viz[nod]=1;
	d[nod]=0;
	diam[nod] = 0;
	int max1 = -1, max2 = -1;
	for(vector <int> :: iterator it = v[nod].begin();it!=v[nod].end();it++) {
		if(viz[*it] == 0) {
			dfs(*it);
			d[nod] = max(d[nod], d[*it] + 1);
			if(d[*it] >= max1) {
				max2 = max1;
				max1 = d[*it];
			}
			else if(d[*it] > max2)
				max2 = d[*it];
			diam[nod] = max(diam[nod], diam[*it]);
			diam[nod] = max(diam[nod], d[*it]  + 1);
		}
	}
	diam[nod] = max(d[nod], max1 + max2 + 2);
}

int find_m(multiset <int, std :: greater <int> > &dd, multiset <int, std :: greater <int> > &len, int s2)
{
	//cout << *len.begin() << '\n';
	int s = max(*dd.begin(), (*len.begin()) + 1);
	if(s2 >= 2) {
		int top = *len.begin();
		len.erase(len.begin());
		s = max((*len.begin()) + top + 2, s);
		len.insert(top);
	}
	return s;
}

int ddd(int d1, int d2)
{
	int s = max(d1, d2);
	if(d1 % 2 == 0)
		d1 = d1 / 2;
	else d1 = (d1 + 1)/2;
	if(d2 % 2 == 0)
		d2 = d2 / 2;
	else d2 = (d2 + 1)/2;
	return max(s, d1 + d2 + 1);
}

void dfs2(int nod, int dt, int mlen)
{
	int t1,t2;
	viz[nod]=1;
	multiset <int, std :: greater <int> > dd, len;
	for(vector <int> :: iterator it = v[nod].begin(); it != v[nod].end(); it++)
		if(viz[*it] == 0) {
			dd.insert(diam[*it]);
			len.insert(d[*it]);
		}
	dd.insert(dt);
	len.insert(mlen);
	
	int s2 = len.size();
	
	for(vector <int> :: iterator it = v[nod].begin(); it != v[nod].end(); it++)
		if(viz[*it] == 0) {
			dd.erase(dd.find(diam[*it]));
			len.erase(len.find(d[*it]));
			t1 = diam[*it];
			t2 = find_m(dd, len, s2 - 1);
			sol = min(sol, ddd(t1, t2));
			dfs2(*it, t2, *len.begin() + 1);
			dd.insert(diam[*it]);
			len.insert(d[*it]);
		}
		
}

int main ()
{
	int n,t,i,x,y;
	ifstream f("revolta.in");
	ofstream g("revolta.out");
	f>>t;
	while(t--) {
		f>>n;
		for(i=1;i<=n-1;i++) {
			f>>x>>y;
			x++;
			y++;
			v[x].push_back(y);
			v[y].push_back(x);
		}
		memset(viz, 0, sizeof(viz));
		dfs(1);
		sol = INF;
		memset(viz, 0, sizeof(viz));
		sol = INF;
		dfs2(1, 0, -1);
		for(i=1;i<=n;i++)
			v[i].clear();
		g << sol << '\n';
	}
	return 0;
}