思路:对于所给的图形来说,可以分为树图和非树图。
两种图的做法不一样,因为树图是没有环的,只有第二种选择。
对于树图来说,我们找出树的每一层有哪几个点,并且保存起来。然后分别查看(0,2,4…)层的总数和(1,3,5…)层的总数,哪一个符合就输出哪一个就行。
对于非树图来讲,就比较麻烦了。
首先我们先找出非树图中最小的环来,假如这个环的长度为len. 如果len<=k的话,那么我们把这个环的点输出就可以了。如果len>k的话,我们可以发现,对于一个长度为len的环,不相邻的点一共有len/2(下取整)个。也就是说,我们找出非树图中最小的环,就一定可以得到符合题意的答案。
那么接下来就是怎么去找非树图的最小环了。具体的我就不赘述了,简而言之就是将一个图先当做树去遍历,记录每一个点出现的次序,如果发现了这个点之前出现的话,就可以直接计算出这个环的长度,然后我们不断的更新最小值,记录一下这个环上面的一个点就行。在dfs的时候记录一下每一个点的先驱节点是什么,方便后面输出。
代码如下:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;const int maxx=1e5+100;
const int maxm=2e5+100;
struct node{int to,next;
}e[maxm<<1];
int head[maxm<<1];
int vis[maxx],dis[maxx],f[maxx];
vector<int> q[maxx];
int n,m,k,tot,ans=inf,pos;inline void init()
{tot=0;memset(head,-1,sizeof(head));memset(dis,0,sizeof(dis));memset(vis,0,sizeof(vis));
}
inline void add(int u,int v)
{e[tot].next=head[u],e[tot].to=v,head[u]=tot++;
}
inline int dfs(int u,int fa,int id)
{dis[u]=id;vis[u]=1;f[u]=fa;for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;if(to==fa) continue;if(vis[to]) //这个点之前遍历过,就说明出现了环{if(ans>abs(dis[to]-dis[u])+1){ans=abs(dis[to]-dis[u])+1;pos=u;}}else dfs(to,u,id+1);}
}
inline void Dfs(int u,int f,int h)
{q[h].push_back(u);for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;if(to==f) continue;Dfs(to,u,h+1);}
}
int main()
{scanf("%d%d%d",&n,&m,&k);init();int x,y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}if(m==n-1){cout<<1<<endl;Dfs(1,0,0);int sumj=0,sumo=0;int i=0;while(q[i].size()){if(i%2==0) sumj+=q[i].size();else sumo+=q[i].size();i++;}int num=(k+1)/2;if(sumj>=num){for(int i=0;;i+=2){for(int j=0;j<q[i].size();j++){cout<<q[i][j]<<" ";num--;if(!num) break;}if(!num) break;}}else{for(int i=1;;i+=2){for(int j=0;j<q[i].size();j++){cout<<q[i][j]<<" ";num--;if(!num) break;}if(!num) break;}}return 0;}vector<int> p;dfs(1,0,0);if(ans<=k){cout<<2<<endl<<ans<<endl;for(int i=1;i<=ans;i++) cout<<pos<<" ",pos=f[pos];cout<<endl;}else{int num=k/2+(k%2==1);cout<<1<<endl;int cnt=0;for(;num;num--){cout<<pos<<" ";pos=f[pos];pos=f[pos];}cout<<endl;}return 0;
}

努力加油a啊,(o)/~

Last Corollary CodeForces - 1364D(dfs树找最小环)相关推荐

  1. CodeForces - 1364D Ehabs Last Corollary(dfs树找最小环)

    题目链接:点击查看 题目大意:给出一个由 n 个结点和 m 条边构成的无向图,再给出一个 k ,需要在图中完成下面任意一种操作: 找到一个大小恰好为  的独立集 找到一个大小不超过 k 的环 题目分析 ...

  2. Last Theorem CodeForces - 1325F(dfs树找最大环+思维)

    It's the year 5555. You have a graph, and you want to find a long cycle and a huge independent set, ...

  3. CodeForces - 1325F Ehabs Last Theorem(dfs树找最大环)

    题目链接:点击查看 题目大意:给出一个由 n 个结点和 m 条边构成的无向图,再给出一个 k ,需要在图中完成下面任意一种操作: 找到一个大小恰好为   的独立集 找到一个大小至少为  的环 题目分析 ...

  4. Codeforces 19E DFS 树

    题意 传送门 Codeforces 19E Fairy 题解 若图中不存在非二分图的连通分量,则任意一边删除后仍是二分图:若图中存在大于一个非二分图的连通分量,则不可能通过删除一条边使之变为二分图.故 ...

  5. Codeforces 962F DFS 树

    题意 传送门 Codeforces 962F Simple Cycles Edges 题解 任一个简单环,都可以通过取 DFSDFSDFS 树单条非树边与树边构成的环的集合 SSS 的任意子集异或得到 ...

  6. Codeforces Round #628 (Div. 2) F. Ehab‘s Last Theorem dfs树

    传送门 文章目录 题意: 思路: 题意: 给你个nnn个点mmm条边的图,可以选择完成以下两个任务中的一个: (1)(1)(1)找出大小恰好为n\sqrt nn​的一个独立集. (2)(2)(2)找出 ...

  7. 图论复习——dfs树,点双,边双,强连通分量

    知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根. 无向图的 dfs树 没有横叉边. 有向图的 dfs树 横叉边方向唯一,总是从后访问的点 ...

  8. 【BZOJ1064】[Noi2008]假面舞会 DFS树

    [BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...

  9. 【BZOJ4424】Cf19E Fairy DFS树

    [BZOJ4424]Cf19E Fairy Description 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成一个二分图. Input 第 1 行包含两个整数 n ...

最新文章

  1. AI超算“攒机”时代到来:为降低算力成本,这家公司牵头开放硬件标准
  2. vim win装_VIM的代码补全工具YouCompleteMe在Windows上的安装攻略
  3. linux中mysql数据库启用日志记录_MYSQL启用日志,和查看日志
  4. 关于虚拟机第二块网卡eth1(仅主机模式)的配置问题
  5. AbortController 中止一个或多个Web请求
  6. Mybatis遇到No constructor found in ....的解决方法
  7. hive函数中的operators, UDF, UDAF, UDTF, PTF
  8. 全球与中国稀土荧光粉市场深度研究分析报告
  9. python网易云爬虫网络技术的意义_Python3爬虫实战之网易云音乐
  10. Matlab R2017b 自动驾驶工具箱学习笔记(2)_Tutorials_Visual Perception Using Monocular Camera
  11. H3C恢复console登录密码
  12. 排列与组合中的递归策略(as3.0)
  13. x265-1.7版本-common/pixel.cpp注释
  14. linux下的lib文件知识
  15. 线性抛物方程的通用有限差分格式及代码(未完)
  16. 用sed命令shell扩大王林快码词库
  17. 万年历SQL Server中实现
  18. 【pySerial3.4官方文档】3、pySerial API
  19. 我发现雷迅提供了完整的中文版的教程,这个很棒
  20. 字体图标的下载和使用

热门文章

  1. ST-GAN: Spatial Transformer Generative Adversarial Networks for Image Compositing 原文翻译
  2. 解决java虚拟机内存不足的错误 java.lang.OutOfMemoryError: PermGen space 没有文件TOMCAT_HOME/bin/catalina.sh
  3. GEEer成长日记十三:Landsat_SR计算地表温度时间序列
  4. CGAL求最小外包矩形
  5. MATLAB数学建模必备算法--层次分析法AHP
  6. 《Java SE实战指南》10-01:特性修饰符概述
  7. 人工智能学习体系大纲
  8. 这几个网站的使用技巧,值得反复读,反复练~
  9. Security(安全框架)
  10. 华为手机 运行 linux,Linux 用户玩转华为手机之华为分享