[CodeForces]981C Useful Decomposition

李煜东dalao今天给我们讲课了QwQ
ppt上一道题
英文题说一下题意吧,以后又看不懂了
将一棵树分割成多个简单路径,每个边只能在一条路径上,但至少有一个公共节点。
输出简单路径分割方法/No
由题易知,如果图不是一个菊花图的话,想搞成题意的样子至少要有环或者有的路径共用。
想到这儿代码搞一搞就行了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N=1e5;
vector<int>s;
int n,ecnt,head[N],mx=0,ct;
struct Edge{
    int to,nxt,val;
}e[N<<1];
int du[N];
void add(int bg,int ed) {
    e[++ecnt].nxt=head[bg];e[ecnt].to=ed;head[bg]=ecnt;
}
int main() {
    scanf("%d",&n);
    int cnt=0;
    for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u),du[u]++,du[v]++;
    for(int i=1;i<=n;i++) {
        if(mx<du[i]) mx=du[i],ct=i;
        if(du[i]>2 ) cnt++;
        else if(du[i]==1)s.push_back(i);
        if(cnt>1) {printf("No");return 0;}
    }
    puts("Yes");
    if(!cnt) {
        puts("1");
        printf("%d %d",s[0],s[1]);return 0;
    }
    printf("%d\n",s.size());
    for(int i=0;i<s.size();i++) printf("%d %d\n",ct,s[i]);
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9275293.html