#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=(int)2e5;
vector<int>ke[N+2];
int sub[N+2],n;
bool ban[N+2]={};
void add_canh(int u,int v){
ke[u].push_back(v) , ke[v].push_back(u);
return;
}
void dfs(int u,int p){
sub[u]=1;
for(auto&v:ke[u]){
if (v==p) continue;
dfs(v,u);
sub[u]+=sub[v];
}
return;
}
int mx=0,mn=0;
int ans=(int)1e9;
void re_dfs(int u,int p){
sub[u]=1;
for(auto&v:ke[u]){
if (v==p) continue;
if (ban[v]) continue;
re_dfs(v,u);
sub[u]+=sub[v];
}
}
void dfs_calc(int u,int p){
for(auto&v:ke[u]){
if (v==p||ban[v]) continue;
int tmp_mx=max(mx,max(sub[u]-sub[v],sub[v]));
int tmp_mn=min(mn,min(sub[u]-sub[v],sub[v]));
ans=min(ans,tmp_mx-tmp_mn);
sub[u]-=sub[v];
sub[v]+=sub[u];
dfs_calc(v,u);
sub[v]-=sub[u];
sub[u]+=sub[v];
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0) ; cout.tie(0);
#define task "main"
if (fopen(task".inp","r")){
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin>>n;
for(int i=1;i<n;++i){
int u,v; cin>>u>>v;
add_canh(u,v);
}
dfs(1,0);
int need=n/3;
int v=-1,dis=(int)1e9;
for(int i=1;i<=n;++i) if (dis>abs(need-sub[i])){
v=i;
dis=abs(need-sub[i]);
}
ban[v]=true;
mx=sub[v],mn=sub[v];
re_dfs(1,0);
dfs_calc(1,0);
cout<<ans;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
papricice.cpp: In function 'int main()':
papricice.cpp:58:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
58 | freopen(task".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
papricice.cpp:59:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
59 | freopen(task".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |