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;
}

 

posted @ 2020-07-14 20:52  sqsq  阅读(147)  评论(0编辑  收藏  举报