Pagini recente » Cod sursa (job #1513312) | Cod sursa (job #1266302) | Cod sursa (job #241381) | Cod sursa (job #587238) | Cod sursa (job #1709648)
#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(diam[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;
}