首页 > 其他分享 >CF1103C 题解

CF1103C 题解

时间:2023-09-08 10:55:11浏览次数:41  
标签:dep 题解 CF1103C 返祖 叶子 int dfs 节点

2023-09-05 14:52:07 solution

找路径很好找,我们随便跑个 dfs 树找个深度 \(\ge \frac{n}{k}\) 的路径输出即可。

可是怎么找 \(k\) 个长度不是 \(3\) 的倍数的环呢?既然我们跑了 dfs 树,那么就没有横叉边,对于叶子节点非树边只有返祖边,然后一看这个很奇怪的条件——保证每个点度数大于等于 3,那岂不是叶子节点可以至少构成两个环?加上两个返祖边构成的环,一共有三个环?我们假设两个祖先分别是 \(u,v\),叶子为 \(x\),那么三个环的大小分别为 \(dep_u-dep_x+1\),\(dep_v-dep_x+1\),\(dep_u-dep_v+2\),显然必然有至少一个不是 \(3\) 的倍数。

又要求每个环至少有一个点在这 \(k\) 个环里只出现一次,我们不能保证我们连上去的返祖边构成的环不包括原来的节点,但是我们可以保证让一个叶子节点只选一个环。上面已经说了每个叶子节点至少可以搞出一个合法环,那有 \(k\) 个吗?

我们如果找不到路径,说明任意的 \(dep_x<\frac{n}{k}\),而每个叶子节点跑到根肯定包含了所有点,也就是 \(\sum_{x\in leaf} dep_x\ge n\)(为链时取等),显然个数不可能小于 \(k\)。

所以这时我们直接找每个叶子节点的两条返祖边然后特判即可。因为每个环的大小必然不超过 \(dep_x\),要输出 \(k\) 个环,那么输出个数不会超过 \(\sum k\times dep_x\le n\),符合题意。

\(Code\)

typedef long long ll;
const int N=250005;
int n,m,k,dep[N],fa[N];
vector<int>f[N];
bool is_leaf[N];
stack<int>S;
void dfs(int x){
    S.push(x);
    dep[x]=dep[fa[x]]+1;
    for(int y:f[x])
        if(!dep[y])fa[y]=x,is_leaf[x]=1,dfs(y);
    if(dep[x]>=n/k){
        puts("PATH");
        printf("%d\n",dep[x]);
        while(!S.empty())printf("%d ",S.top()),S.pop();
        exit(0);
    }
    S.pop();
}
int main(){
    n=read(),m=read(),k=read();
    for(int i=1,u,v;i<=m;i++)
        f[u=read()].push_back(v=read()),f[v].push_back(u);
    dfs(1);
    puts("CYCLES");
    for(int x=1,w=0;w<k&&x<=n;x++){
        if(is_leaf[x])continue;
        int u=0,v=0;
        for(int y:f[x])
            if(y==fa[x])continue;
            else if(!u)u=y;
            else if(!v)v=y;
            else break;
        if(dep[u]<dep[v])u^=v^=u^=v;
        if((dep[x]-dep[v]+1)%3!=0){
            printf("%d\n",dep[x]-dep[v]+1);
            for(int o=x;o!=fa[v];o=fa[o])printf("%d ",o);
        }else if((dep[x]-dep[u]+1)%3!=0){
            printf("%d\n",dep[x]-dep[u]+1);
            for(int o=x;o!=fa[u];o=fa[o])printf("%d ",o);
        }else{
            printf("%d\n",dep[u]-dep[v]+2);
            for(int o=u;o!=fa[v];o=fa[o])printf("%d ",o);
            printf("%d ",x);
        }
        puts("");
        w++;
    }
    return 0;
}

标签:dep,题解,CF1103C,返祖,叶子,int,dfs,节点
From: https://www.cnblogs.com/NBest/p/17687005.html

相关文章

  • CF1851 部分题解
    2023-07-3019:35:02前言因为我实在是太菜了,没时间也不会做最后两题,所以这里只有前\(5\)道签到题的题解。之后我有时间看了后两题的题解再来更新吧~A先不用看那么多七七八八的,搞清楚下面几点即可:高度不能相同。高度差得被整除。高度差不能太大。好了,然后就可以\(AC\)......
  • 暑假集训Day19 比赛题解
    2023-08-0516:22:13总结这次打下来,由于T2贪心不够完全,T3模拟\(5\)个时不是最优,T4想到暴力做法但是来不及打,加之全都是捆绑测试点,导致我T2,T3虽然加起来有不少点对了,但是还是判全错,最后也只剩下T1的100。感觉这次前三题也不难,都是可做的,T4的30pts暴力也很白给,但......
  • 暑假集训 Day17 模拟赛题解
    2023-08-0318:18:03前言好家伙,很少完整订正一场比赛,可能是因为这个比赛相对来说确实不难吧(至少正解不难)。总结与反思这场比赛其实没有我想象的那么难,只是觉得题目可能不简单,就没有往简单的思路想,反而是被之前讲过的题疑惑,以为要用到一些很奇特的算法,结果打完以后看了题解再结......
  • UVA10368 题解
    2023-08-0615:18:08solution双倍经验这种有限轮游戏的博弈通常都是有两种状态,必胜态和必败态。对于必胜态,指的是从它可以转移到必败态。对于必败态,指的是从它不论如何只能转移到必胜态。对于每个玩家都采取最优策略的有限游戏,我们通常只需要关注必胜态与必败态之间的转移即......
  • 【题解】AtCoder Regular Contest 162
    A.EkidenRace题目描述:有\(n\)个人参加了往返赛跑,每个人有一个编号\(1\)到\(n\)。已知以下信息:如果按照往路的成绩排序,那么任何两个人的成绩都不相同。同时第\(i\)个人在往路中排名第\(i\)。如果按照往返的成绩排序,那么任何两个人的成绩都不相同。同时第\(i\)个人......
  • P9189 [USACO23OPEN] Custodial Cleanup G 题解
    Description奶牛旅馆可以被看作一个\(N\)个节点\(M\)条边的无向简单图,其中每个房间有一个颜色\(C_i\),以及一个钥匙,颜色为\(S_i\),FJ最初在\(1\)号节点,手上一把钥匙都没有。FJ可以进行无数次以下操作:捡起当前房间的钥匙。(FJ可以同时手持多个钥匙)将部分或全部手......
  • All Pairs Maximum Flow题解
    前置知识:1.P3376【模板】网络最大流2.P4897【模板】最小割树(Gomory-HuTree)Ebola有一句很著名的话如果你乱搞过了我请你抽烟那么这道题肯定不能普通的dinic直接水过去,不然就不是紫题了,那么直接祭出最小割树,复杂度\(O(Tn^3m)\),但是因为dinic跑不满,所以是可以过的。......
  • [题解] AtCoder Beginner Contest 308 A~G
    AtCoderBeginnerContest308A~GA.NewSchemevoidMain(){vector<i64>a(8);for(auto&x:a)cin>>x;if(!is_sorted(a.begin(),a.end())&&!all_of(a.begin(),a.end(),[](auto&x){returnx%25!=0||!(100......
  • CF1374E2 Reading Books(hard version) 题解
    CF1374E2ReadingBooks(hardversion)这道题是在CF1374E1ReadingBooks(easyversion)的基础上出的,而且仅仅增加了一个\(m\)的限制,下面的做法也是基于简单版的思路而想到的。建议先尝试简单版,然后尝试此题。题意简述:有\(n\)本书,每本书有一个阅读时间\(t_i\),和属性\(......
  • Eclipse里做JBPM工作流gpd.xml中文乱码问题解决
         刚开始接到是做一个简单的文档借阅流程,对于流程定义是采用eclipse中的jbpm插件,但存在一个问题是节点中文命名的在gpd.xml中全部为乱码或根本看不到任何东西。     但是网上有人说没关系,这只是eclipse本身存在的一个bug,在项目所在硬盘目录下打开该文件还是显示正常......