1. 程式人生 > 實用技巧 >2020牛客暑期多校訓練營(第二場)C

2020牛客暑期多校訓練營(第二場)C

思路:

用類似於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\n%d %d\n",u,v); for(int i=1;i<=n;i++){ if(vec[i].size()>1){ dfs(i,-1); break; } } printf("%d\n",(ans+1)/2); for(int i=1;i<=(ans+1)/2;i++) printf("%d %d\n",a[i],a[i+ans/2]); return 0; }