1 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n; vector<int> e[200010]; int dp[200010][2],mx2[200010],sz[200010],g[200010],ans=1e9,g2[200010]; void dfs(int x,int xfa){ sz[x]=1; for(int y:e[x])if(y!=xfa){ dfs(y,x); sz[x]+=sz[y]; if(g[y]>=g[x]){ g2[x]=g[x]; g[x]=g[y]+1; } else if(g[y]>=g2[x]){ g2[x]=g[y]+1; } dp[x][1]=(dp[x][1]+min(dp[y][1]+2,2*(sz[y]-1)-g[y]+1)); ll p=min(dp[y][0]+dp[y][1]+1,2*(sz[y]-1)-g[y]+1)-min(dp[y][1]+2,2*(sz[y]-1)-g[y]+1); if(p<dp[x][0]){ mx2[x]=dp[x][0]; dp[x][0]=p; } else if(p<mx2[x]){ mx2[x]=p; } } } void dfs2(int x,int xfa){ ans=min(ans,dp[x][1]+dp[x][0]); for(int y:e[x])if(y!=xfa){ int tsz=sz[x]-sz[y]; ll gx=(g[x]==g[y]+1?g2[x]:g[x]); ll p=min(dp[y][0]+dp[y][1]+1,2*(sz[y]-1)-g[y]+1)-min(dp[y][1]+2,2*(sz[y]-1)-g[y]+1); ll dpx1=dp[x][1]-min(dp[y][1]+2,2*(sz[y]-1)-g[y]+1),dpx0=(dp[x][0]==p?mx2[x]:dp[x][0]); sz[y]+=tsz;assert(sz[y]==n); if(gx>=g[y]){ g2[y]=g[y]; g[y]=gx+1; } else if(gx>=g2[y]){ g2[y]=gx+1; } dp[y][1]=(dp[y][1]+min(dpx1+2,2*(tsz-1)-gx+1)); p=min(dpx0+dpx1+1,2*(tsz-1)-gx+1)-min(dpx1+2,2*(tsz-1)-gx+1); if(p<dp[y][0]){ mx2[y]=dp[y][0]; dp[y][0]=p; } else if(p<mx2[y]){ mx2[y]=p; } dfs2(y,x); } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n; for(int i=1,x,y;i<n;i++){ cin>>x>>y; e[x].push_back(y); e[y].push_back(x); } dfs(1,0); dfs2(1,0); cout<<ans; return 0; }
- 1
信息
- ID
- 1252
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 13
- 已通过
- 3
- 上传者