JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph
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相关推荐
- 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 ...
- JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫
Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...
- JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed
Description 小w 心里的火焰就要被熄灭了. 简便起见,假设小w 的内心是一棵n -1 条边,n 个节点的树. 现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个. 接下来每个节点都 ...
- JZOJ 100026. 【NOIP2017提高A组模拟7.7】图
Description 有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发 ...
- JZOJ 5379. 【NOIP2017提高A组模拟9.21】Victor爱数字
Description Victor 是一名热爱数字的同学.他最近在思考这样一个问题: 一个字符串是回文的当且仅当它倒过来还和原来相同.那么如果一个数的数串没有一个长度超过1 的子串是回文串的话,它就 ...
- 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 ...
- JZOJ 5398. 【NOIP2017提高A组模拟10.7】Adore
Description 小w 偶然间见到了一个DAG. 这个DAG 有m 层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k 个节点. 现在小w 每次可以取反第i(1 < i &l ...
- JZOJ 5399. 【NOIP2017提高A组模拟10.7】Confess
Description 小w 隐藏的心绪已经难以再隐藏下去了. 小w 有n + 1(保证n 为偶数) 个心绪,每个都包含了[1,2n] 的一个大小为n 的子集. 现在他要找到隐藏的任意两个心绪,使得他 ...
- 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 ...
最新文章
- VS2013+OpenCV3.1.0配置教程
- 【渝粤教育】电大中专职业生涯规划 (3)作业 题库
- html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
- android学习笔记---36_Activity生命周期
- android arcgis 添加地图,ArcGis for Android在地图上添加自定义图标
- android通过拼音搜索中文的功能
- 用户体验设计5大目标
- 基于javaweb+jsp的小蜜蜂扩音器网上商城系统(java+JSP+Servlet+JDBC+Ajax+mysql)
- 【Go】Go 语言运算符及其优先级
- 习题4-5 换硬币(20 分)
- hive-create table
- linux 新建1 10文件夹,linux创建目录和文件的命令
- 使用U8G2在oled屏幕上显示胡桃摇动画
- CUDA 编程简介(上)
- 使用Office内置的VBA编辑器实现WORD文档的批量查找替换
- 【算法练习】LeetCode-2322. 从树中删除边的最小分数
- 最详细的Obj数据解析
- 基于HTML服装商城项目的设计与实现
- 发现了一款很好用的分析SQL脚本数据流关系的工具SQLFlow
- 每日一题:由卢卡斯队列引出java四舍五入