思路:
用类似于DFS序的方法将每个叶子节点编号,求出叶子结点个数ans,链的条数就是ans/2向上取整,考虑到每一条边都要被链覆盖,所以第i个叶子节点需要和第ans/2+i个叶子节点相匹配
#include<iostream> #include<stdio.h> #include<vector> using namespace std; const int maxn = 2e6+5; int n,u,v,ans,a[maxn]; vector<int> vec[maxn]; void dfs(int x,int fa){ if(vec[x].size()==1) a[++ans]=x; for(int i=0;i<vec[x].size();i++){ int y = vec[x][i]; if(y==fa) continue; dfs(y,x); } } int main(){ scanf("%d",&n); for(int i=1;i<n;i++){ scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } if(n==2) printf("1 %d %d ",u,v); for(int i=1;i<=n;i++){ if(vec[i].size()>1){ dfs(i,-1); break; } } printf("%d ",(ans+1)/2); for(int i=1;i<=(ans+1)/2;i++) printf("%d %d ",a[i],a[i+ans/2]); return 0; }