[ARC156C] Tree and LCS

Problem Statement

We have a tree $T$ with vertices numbered $1$ to $N$. The $i$-th edge of $T$ connects vertex $u_i$ and vertex $v_i$.

Let us use $T$ to define the similarity of a permutation $P = (P_1,P_2,\ldots,P_N)$ of $(1,2,\ldots,N)$ as follows.

  • For a simple path $x=(x_1,x_2,\ldots,x_k)$ in $T$, let $y=(P_{x_1}, P_{x_2},\ldots,P_{x_k})$. The similarity is the maximum possible length of a longest common subsequence of $x$ and $y$.

Construct a permutation $P$ with the minimum similarity.

What is a subsequence?

A subsequence of a sequence is a sequence obtained by removing zero or more elements from that sequence and concatenating the remaining elements without changing the relative order.
For instance, \((10,30)\) is a subsequence of \((10,20,30)\), but \((20,10)\) is not.

What is a simple path? For vertices $X$ and $Y$ in a graph $G$, a walk from $X$ to $Y$ is a sequence of vertices $v_1,v_2, \ldots, v_k$ such that $v_1=X$, $v_k=Y$, and there is an edge connecting $v_i$ and $v_{i+1}$. A simple path (or simply a path) is a walk such that $v_1,v_2, \ldots, v_k$ are all different.

Constraints

  • $2 \leq N \leq 5000$
  • $1\leq u_i,v_i\leq N$
  • The given graph is a tree.
  • All numbers in the input are integers.

Input

The input is given from Standard Input in the following format:

$N$
$u_1$ $v_1$
$u_2$ $v_2$
$\vdots$
$u_{N-1}$ $v_{N-1}$

Output

Print a permutation $P$ with the minimum similarity, separated by spaces. If multiple solutions exist, you may print any of them.


Sample Input 1

3
1 2
2 3

Sample Output 1

3 2 1

This permutation has a similarity of $1$, which can be computed as follows.

  • For $x=(1)$, we have $y=(P_1)=(3)$. The length of a longest common subsequence of $x$ and $y$ is $0$.

  • For $x=(2)$, we have $y=(P_2)=(2)$. The length of a longest common subsequence of $x$ and $y$ is $1$.

  • For $x=(3)$, we have $y=(P_2)=(1)$. The length of a longest common subsequence of $x$ and $y$ is $0$.

  • For $x=(1,2)$, we have $y=(P_1,P_2)=(3,2)$. The length of a longest common subsequence of $x$ and $y$ is $1$. The same goes for $x=(2,1)$, the reversal of $(1,2)$.

  • For $x=(2,3)$, we have $y=(P_2,P_3)=(2,1)$. The length of a longest common subsequence of $x$ and $y$ is $1$. The same goes for $x=(3,2)$, the reversal of $(2,3)$.

  • For $x=(1,2,3)$, we have $y=(P_1,P_2,P_3)=(3,2,1)$. The length of a longest common subsequence of $x$ and $y$ is $1$. The same goes for $x=(3,2,1)$, the reversal of $(1,2,3)$.

We can prove that no permutation has a similarity of $0$ or less, so this permutation is a valid answer.

首先看样例很容易知道,答案至多为1.

那么想要使两个串的 LCS 为1,可以尝试不断剖叶子构造。

维护一个叶子队列,每次取出两个叶子 \(a,b\),令 \(P_a=b,P_b=a\)。这样构造是合法的。

首先假设证明了之前的链的的 LCS 都是 1,此时加入这样两个叶子,那么如果想要让 LCS 更大,需要使选的序列在 \(a,b\) 的后面,那么此时 LCS 仍是1.

#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int fa[N],in[N],l=1,r=0,q[N],n,rt,hd[N],e_num,p[N];
struct edge{
	int v,nxt;
}e[N<<1];
void add_edge(int u,int v)
{
	e[++e_num]=(edge){v,hd[u]};
	hd[u]=e_num; 
}
int main()
{
	scanf("%d",&n);
	if(n==2)
	{
		puts("2 1");
		return 0;
	}
	for(int i=1,u,v;i<n;i++)
		scanf("%d%d",&u,&v),in[u]++,in[v]++,add_edge(u,v),add_edge(v,u);
	for(int i=1;i<=n;i++)
		if(in[i]==1)
			rt=i,q[++r]=i;;
	while(l<r)
	{
		p[q[l]]=q[l+1];
		p[q[l+1]]=q[l];
		for(int i=hd[q[l]];i;i=e[i].nxt)
		{
			in[e[i].v]--;
			if(in[e[i].v]==1)
				q[++r]=e[i].v;
		}
		for(int i=hd[q[l+1]];i;i=e[i].nxt)
		{
			in[e[i].v]--;
			if(in[e[i].v]==1)
				q[++r]=e[i].v;
		} 
		l+=2;
	}
//	printf("%d %d\n",l,r);
	if(l==r)
		p[q[l]]=q[l];
	for(int i=1;i<=n;i++)
		printf("%d ",p[i]);
	return 0;
}
posted @ 2023-02-20 09:57  灰鲭鲨  阅读(36)  评论(0编辑  收藏  举报