P3629求助
查看原帖
P3629求助
1041884
_Liyx_楼主2024/7/19 18:05

k等于2的情况,权值标-1有问题,望大佬帮帮

#include <bits/stdc++.h>
using namespace std;
#define N 100005
int n,k,ans;
int head[N],edge[2*N],nxt[2*N],w[2*N],vis[N],d[N],idx=1;
int c,f[N];
void add(int a,int b,int c){
	edge[++idx]=b;
	w[idx]=c;
	nxt[idx]=head[a];
	head[a]=idx;
}
void dp(int x,int fa){
	vis[x]=1;
	for(int i=head[x];i;i=nxt[i]){
		int y=edge[i];
		if(vis[y]) continue;
		if(y==fa) continue;
		dp(y,x);
		ans=max(ans,d[x]+d[y]+w[i]);
		d[x]=max(d[x],d[y]+w[i]);
	}
	return;
}
void dfs(int x,int fa,int fl){
	d[x]=d[fa]+1;
	for(int i=head[x];i;i=nxt[i]){
		int y=edge[i];
		if(y==fa) continue;
		if(fl) f[x]=i^1;
		if(d[y]>d[c]) c=y;
		dfs(y,x,fl);
	}
	return;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		add(x,y,1);
		add(y,x,1);
	}
	if(k==0) cout<<2*(n-1);
	else if(k==1){
		dp(1,0);
		cout<<2*(n-1)-ans+1;
	}
	else{
		dfs(1,0,0);
		int s=c;
		dfs(s,0,1);
		int t=c;
		while(c!=s){
			int p=f[c];
			w[p]=w[p^1]=-1;
			c=edge[p];
		}
		dp(1,0);
		cout<<2*n-ans-d[t];
	}
	
	return 0;
}
2024/7/19 18:05
加载中...