1 条题解

  • 0
    @ 2026-4-3 15:25:55
    #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
    上传者