Description

给定一张n个点m条边的无向图,每条边连接两个顶点,保证无重边自环,不保证连通
你想在这张图上进行若干次旅游,每次旅游可以任选一个点x作为起点,再走到一个与x 直接有边相连的点y,再走到一个与y 直接有边相连的点z 并结束本次旅游
作为一个旅游爱好者,你不希望经过任意一条边超过一次,注意一条边不能即正向走一次又反向走一次,注意点可以经过多次,在满足此条件下,你希望进行尽可能多次的旅游,请计算出最多能进行的旅游次数并输出任意一种方案

Input

第1 行两个正整数n 与m,表示全图的点数与边数
下接m 行,每行两个数字u 与v 表示一条边

Output

第1 行一个整数cnt 表示答案
下接cnt 行,每行三个数字x, y 与z,表示一次旅游的路线
如有多种旅行方案,任意输出一种即可

Sample Input

4 5
1 2
3 2
2 4
3 4
4 1

Sample Output

1
2

Data Constraint

对于前20% 的数据,n <= 10;m <= 20.
对于令20% 的数据,m = n - 1,并且图连通
对于令10% 的数据,每个点的度数不超过2
对于100% 的数据,n <= 100000;m <= 200000

Solution

  • 由于这个图不一定是连通图,且两两联通块之间互不影响,所以这里只讨论一个联通快。

  • 对于一个边数为 mm 联通快,显然能有 ⌊m2⌋\lfloor\frac{m}{2}\rfloor 条旅游路线,因为点能重复走。

-问题是如何连边呢?

  • 把连通块看成一棵树,遍历一遍,记录遍历的顺序。(注意只走尚未走过的点)

  • 按照遍历的顺序的倒序操作,对于一个点,又开一个队列。

  • 先把连“儿子”节点的边加入进去,有的话再将连“父亲”节点的边加入进去。

  • 这样两条两条进行组合,就能不重不漏地匹配,

  • 因为先匹配深度大、再匹配深度小的,就能保证深度大的一定能被匹配,深度小的可以以后再说。

  • 最后将每个连通块中匹配的边都一起输出即可。

Code

#include<cstdio>
using namespace std;
const int N=100001;
int tot,ans;
int first[N],next[N<<2],en[N<<2];
int fa[N],q[N],num[N],vis[N<<2],ans1[N][3];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline void insert(int x,int y)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline void bfs(int x)
{int l=0,r=1;fa[q[1]=x]=-1;while(l<r)for(int i=first[q[++l]];i;i=next[i])if(!fa[en[i]]) fa[q[++r]=en[i]]=q[l];for(int i=r;i;i--){num[0]=0;for(int j=first[q[i]];j;j=next[j])if(!vis[j] && en[j]!=fa[q[i]]) num[++num[0]]=j;for(int j=first[q[i]];j;j=next[j])if(!vis[j] && en[j]==fa[q[i]]){num[++num[0]]=j;break;}for(int j=1;j<num[0];j+=2){vis[num[j]]=vis[num[j]^1]=vis[num[j+1]]=vis[num[j+1]^1]=true;ans1[++ans][0]=en[num[j]];ans1[ans][1]=q[i];ans1[ans][2]=en[num[j+1]];}}
}
int main()
{int n=read(),m=read();for(int i=tot=1;i<=m;i++){int x=read(),y=read();insert(x,y);insert(y,x);}for(int i=1;i<=n;i++)if(!fa[i]) bfs(i);printf("%d\n",ans);for(int i=1;i<=ans;i++)printf("%d %d %d\n",ans1[i][0],ans1[i][1],ans1[i][2]);return 0;
}

JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph相关推荐

  1. JZOJ 100035. 【NOIP2017提高A组模拟7.10】区间

    Description Input Output Sample Input sample1: 4 2 10 5 1 1 10 sample2: 1000 97 96998351 41 1668 505 ...

  2. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  3. JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed

    Description 小w 心里的火焰就要被熄灭了. 简便起见,假设小w 的内心是一棵n -1 条边,n 个节点的树. 现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个. 接下来每个节点都 ...

  4. JZOJ 100026. 【NOIP2017提高A组模拟7.7】图

    Description 有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发 ...

  5. JZOJ 5379. 【NOIP2017提高A组模拟9.21】Victor爱数字

    Description Victor 是一名热爱数字的同学.他最近在思考这样一个问题: 一个字符串是回文的当且仅当它倒过来还和原来相同.那么如果一个数的数串没有一个长度超过1 的子串是回文串的话,它就 ...

  6. JZOJ 5401. 【NOIP2017提高A组模拟10.8】Star Way To Heaven

    Description Input Output Sample Input 10 5 2 1 1 2 3 Sample Output 1.11803399 Data Constraint Soluti ...

  7. JZOJ 5398. 【NOIP2017提高A组模拟10.7】Adore

    Description 小w 偶然间见到了一个DAG. 这个DAG 有m 层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k 个节点. 现在小w 每次可以取反第i(1 < i &l ...

  8. JZOJ 5399. 【NOIP2017提高A组模拟10.7】Confess

    Description 小w 隐藏的心绪已经难以再隐藏下去了. 小w 有n + 1(保证n 为偶数) 个心绪,每个都包含了[1,2n] 的一个大小为n 的子集. 现在他要找到隐藏的任意两个心绪,使得他 ...

  9. JZOJ 5396. 【NOIP2017提高A组模拟10.6】Blocks

    Description Input Output Sample Input 10 5 1 7 9 9 5 9 3 4 5 8 5 7 20 9 1 Sample Output 10 6 0 2 10 ...

最新文章

  1. VS2013+OpenCV3.1.0配置教程
  2. 【渝粤教育】电大中专职业生涯规划 (3)作业 题库
  3. html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
  4. android学习笔记---36_Activity生命周期
  5. android arcgis 添加地图,ArcGis for Android在地图上添加自定义图标
  6. android通过拼音搜索中文的功能
  7. 用户体验设计5大目标
  8. 基于javaweb+jsp的小蜜蜂扩音器网上商城系统(java+JSP+Servlet+JDBC+Ajax+mysql)
  9. 【Go】Go 语言运算符及其优先级
  10. 习题4-5 换硬币(20 分)
  11. hive-create table
  12. linux 新建1 10文件夹,linux创建目录和文件的命令
  13. 使用U8G2在oled屏幕上显示胡桃摇动画
  14. CUDA 编程简介(上)
  15. 使用Office内置的VBA编辑器实现WORD文档的批量查找替换
  16. 【算法练习】LeetCode-2322. 从树中删除边的最小分数
  17. 最详细的Obj数据解析
  18. 基于HTML服装商城项目的设计与实现
  19. 发现了一款很好用的分析SQL脚本数据流关系的工具SQLFlow
  20. 每日一题:由卢卡斯队列引出java四舍五入

热门文章

  1. FlexRay车载网络标准
  2. (转)谷歌公开dopamine
  3. Deeplearning 入门篇
  4. 牛客网题目——替换空格
  5. 【Leetcode】几种简单的排序算法
  6. 【Python】字符转换为 ASCII 码
  7. 科大星云诗社动态20220103
  8. 幅度为a0的载波由峰峰值_十个医疗箱都不够用?戒掉这些坏习惯,满活跃值闯进决赛圈不是梦!...
  9. 关于iis中的网站,在ie下点击服务器控件无反应的问题
  10. react创建新项目