AT_toyota2023spring_final_g Git Gud
题目描述
编程初学者すぬけくん写了如下代码。
```
N = read_integer()
parent = array(N, -1) // 创建长度为 N 的数组 parent,并将所有元素初始化为 -1
find(v):
if parent[v] == -1:
return v
else:
return find(parent[v])
union(a,b):
parent[find(b)] = find(a)
for i = 0 to N-2:
A_i = read_integer()
B_i = read_integer()
union(A_i,B_i)
```
这段程序接收一棵 $N$ 个顶点的树的信息,并用 Union-Find 仅仅连接边。
编程大师りんごさん注意到了这个程序的缺陷。也就是说,这个 Union-Find 并没有做任何优化。
现在,りんごさん有一棵包含 $N$ 个顶点的树 $T$。$T$ 的顶点编号为 $0$ 到 $N-1$,边的编号为 $0$ 到 $N-2$。第 $i$ 条边连接顶点 $A_i$ 和顶点 $B_i$。
りんごさん打算将 $T$ 作为输入给すぬけくん的程序。不过在此之前,他可以自由地重新排列 $T$ 的边的编号,以及每条边的两个端点的顺序。
りんごさん想要最大化 `find` 函数被调用的次数,以此来展示すぬけくん的程序效率低下。请你求出 `find` 函数被调用次数的最大值。
输入格式
输入通过标准输入给出,格式如下:
> $N$ $A_0$ $B_0$ $A_1$ $B_1$ $\cdots$ $A_{N-2}$ $B_{N-2}$
输出格式
请输出答案。
说明/提示
## 限制条件
- $2 \leq N \leq 2000$
- $0 \leq A_i, B_i \leq N-1$
- $A_i \neq B_i$
- 输入的图一定是一棵树
## 样例解释 1
`find` 函数一定会被调用 $2$ 次。
## 样例解释 2
将第 $0$ 条边的端点顺序交换,构造成如下输入,则 `find` 函数会被调用 $5$ 次。
```
3 1 0 0 2
```
## 样例解释 3
通过适当调整边的顺序和端点顺序,构造成如下输入,则 `find` 函数会被调用 $13$ 次。
```
5 3 0 4 3 1 0 0 2
```
由 ChatGPT 4.1 翻译