# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1143516 | hhvb | 새로운 문제 (POI13_luk) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
queue<int> q;
vector< pair<int, int> > m;
long long need[300001]
int h[300001];
bool used[300001];
vector<int> adj[300001];
int main()
{
int n, u, v, adancime, k;
int i;
cin >> n;
for ( i= 0; i < n - 1; i ++ ) {
cin >> u >> v;
adj[u].push_back( v );
adj[v].push_back( u );
}
q.push( 1 );
used[1] = true;
m.push_back( {0, 1} );
adancime = 0;
h[1] = 0;
while ( !q.empty() ) {
u = q.front();
for ( i = 0; i < adj[u].size(); i ++ ) {
if ( used[ adj[u][i] ] == false ) {
q.push( adj[u][i] );
v = h[u] + 1;
h [ adj[u][i] ] = v;
m.push_back( make_pair( v, adj[u][i] ) );
used[adj[u][i]] = true;
if ( v > adancime )
adancime = v;
}
}
q.pop();
}
sort ( m.begin(), m.end() );
int l, r, j;
l = 0;
r = 300000;
if ( n == 1 ) {
cout << 0;
} else if ( n == 2 ) {
cout << 1;
}else {
while ( l + 1 < r ) {
k = (l + r) / 2;
for ( i = n - 1; i >= 0; i -- ){
u = m[i].second;
if ( m[i].first == adancime ) {
need[u] = 0;
}
else {
for ( j = 0; j < adj[u].size(); j ++ ) {
if ( h[ adj[u][j] ] > h[u] )
need[u] = need[u] + need[ adj[u][j] ] + 1;
}
need[u] -= k;
if ( need[u] < 0 )
need[u] = 0;
}
}
if ( need[1] > 0 ) {
l = k;
}
else {
r = k;
}
}
cout << l << "\n";
}
return 0;
}