[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;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号