96pts?wa 第一个点求调 qwq
查看原帖
96pts?wa 第一个点求调 qwq
481621
Zhang_Wenjie楼主2024/7/8 14:52
#include <bits/stdc++.h>
#define re register int 
#define max(x, y) (x > y ? x : y)

using namespace std;
const int N = 1e5 + 10, inf = - 100001;

struct Edge
{
	int to, w, next;
}e[N << 1];
int top, h[N];
int n, k, ans, len = inf, pre[N], nex[N], maxs = inf;

inline void add(int x, int y, int w)
{
	e[++ top] = (Edge){y, w, h[x]};
	h[x] = top;
}

int dp(int u, int fa)
{
	int d1 = 0, d2 = 0;
	
	for (re i = h[u]; i; i = e[i].next)
	{
		int v = e[i].to, w = e[i].w;
		
		if (v == fa) continue;
		
		int d = dp(v, u) + w;
		if (d > d1) d2 = d1, d1 = d;
		else if (d > d2) d2 = d;
	}
	len = max(len, d1 + d2);
	
	return d1;

}

void dfs(int u, int fa, int size, int & to, int & res, int type)
{
	if (size > maxs)
	{
		maxs = size;
		to = u;
		
		if (type) res = size; 
	}
	
	for (re i = h[u]; i; i = e[i].next)
	{
		int v = e[i].to;
		
		if (v == fa) continue;
		if (type) pre[v] = u;
		dfs(v, u, size + e[i].w, to, res, type);
	}
}

void draw_pre(int u)
{
//	cout << u << ' ';	
	for (re i = h[u]; i; i = e[i].next)
	{
		int v = e[i].to;
		
		if (pre[u] == v) 
		{
			e[i].w = -1;
			nex[v] = u;
			draw_pre(v);
		}
	}
}

void draw_nex(int u)
{
	
	for (re i = h[u]; i; i = e[i].next)
	{
		int v = e[i].to;
		
		if (nex[u] == v) 
		{
			e[i].w = -1;
			draw_nex(v);
		}
	}
}

inline void work()
{
	if (k == 1)
	{
		dp(1, 0);
		ans = 2 * (n - 1) - len + 1;
	}
	else
	{
		int p = 0, q = 0, L1 = 0, L2 = 0;
		dfs(1, 0, 0, p, L1, 0);
		dfs(p, 0, 0, q, L1, 1);
		
		draw_pre(q);
		draw_nex(p);
/*
		for (re i = 1; i <= n; i ++)
			cout << i << " --> " << nex[i] << '\n';

		for (re i = 1; i <= n; i ++)
			cout << i << " <-- " << pre[i] << '\n';
		
		for (re i = 1; i <= n; i ++)
			for (re j = h[i]; j; j = e[j].next)
				cout << i << ' ' << e[j].to << ' ' << e[j].w << '\n';
*/
		len = inf;
		dp(1, 0);
		L2 = len;	
		ans = 2 * n - L1 - L2;
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> n >> k;
	for (re i = 1; i < n; i ++)
	{
		int x, y; cin >> x >> y;
		add(x, y, 1);
		add(y, x, 1);
	}
	work();
	cout << ans << '\n';
	
	return 0;
}
2024/7/8 14:52
加载中...