P3629玄关求调(wgzs
  • 板块灌水区
  • 楼主Super_Masarada
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/28 11:38
  • 上次更新2024/9/28 14:26:48
查看原帖
P3629玄关求调(wgzs
935377
Super_Masarada楼主2024/9/28 11:38
#include <bits/stdc++.h>
namespace SXL {
	using std::vector;
	using std::array;
	using std::max;
	constexpr int MAXN = 100005;
	vector<array<int,2>> edge[MAXN];
	int id,maxx,l,r,ans;
	int dis[MAXN];
	void dfs(int x,int fa,int step) {
		if(step >= maxx) {
			id = x;
			maxx = step;
		}
		for(auto i : edge[x]) {
			if(i[0] == fa) continue;
			dfs(i[0],x,step + 1);
		}
	}
	bool dfsToChange(int x,int fa,int tar) {
		if(x == tar) return true;
		for(int i = 0;i < edge[x].size();i++) {
			if(edge[x][i][0] == fa) continue;
			if(dfsToChange(edge[x][i][0],x,tar)) {
				edge[x][i][1] = -1;
				return true;
			}
		}
		return false;
	}
	int solve1() {
		dfs(1,0,0);
		r = id;
		id = 0;
		maxx = 0;
		dfs(r,0,0);
		l = id;
		dfsToChange(l,0,r);
		return maxx;
	}
	void solve2(int x,int fa) {
		for(auto i : edge[x]) {
			if(i[0] == fa) {
				continue;
			}
			solve2(i[0],x);
			ans = max(ans,dis[x] + dis[i[0]] + i[1]);
			dis[x] = max(dis[x],dis[i[0]] + i[1]);
		}
	}
	void main() {
		int n,k;
		scanf("%d%d",&n,&k);
		for(int i = 1,a,b;i < n;i++) {
			scanf("%d%d",&a,&b);
			edge[a].push_back({b,1});
			edge[b].push_back({a,1});
		}
		if(k == 1) {
			solve2(1,0);
			printf("%d\n",2 * n - ans - 1);
		} else {
			int l1 = solve1();
			solve2(1,0);
			printf("%d\n",2 * n - l1 - ans);
		}
	}
}
int main() {
	SXL::main();
	return 0;
}
2024/9/28 11:38
加载中...