JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph
来源:互联网 发布:五金进销存软件 编辑:程序博客网 时间:2024/06/05 02:19
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
由于这个图不一定是连通图,且两两联通块之间互不影响,所以这里只讨论一个联通快。
对于一个边数为
m 联通快,显然能有⌊m2⌋ 条旅游路线,因为点能重复走。
-问题是如何连边呢?
把连通块看成一棵树,遍历一遍,记录遍历的顺序。(注意只走尚未走过的点)
按照遍历的顺序的倒序操作,对于一个点,又开一个队列。
先把连“儿子”节点的边加入进去,有的话再将连“父亲”节点的边加入进去。
这样两条两条进行组合,就能不重不漏地匹配,
因为先匹配深度大、再匹配深度小的,就能保证深度大的一定能被匹配,深度小的可以以后再说。
最后将每个连通块中匹配的边都一起输出即可。
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 5404. 【NOIP2017提高A组模拟10.10】Graph
- 【NOIP2017提高A组模拟10.10】Graph
- 5404. 【NOIP2017提高A组模拟10.10】Graph
- JZOJ 5406. 【NOIP2017提高A组模拟10.10】Tree
- 【JZOJ 5405】【NOIP2017提高A组模拟10.10】Permutation
- JZOJ 5405.【NOIP2017提高A组模拟10.10】Permutation
- JZOJ 5405. 【NOIP2017提高A组模拟10.10】Permutation
- JZOJ 5435. 【NOIP2017提高A组集训10.30】Graph
- 【JZOJ 5435】【NOIP2017提高A组集训10.30】Graph
- 【JZOJ 4931】【NOIP2017提高组模拟12.24】A
- 【JZOJ 4931】【NOIP2017提高组模拟12.24】A
- JZOJ 5195. 【NOIP2017提高组模拟7.3】A
- JZOJ 100026. 【NOIP2017提高A组模拟7.7】图
- JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情
- jzoj. 100031. 【NOIP2017提高A组模拟7.9】外星密码
- JZOJ 100035【NOIP2017提高A组模拟7.10】区间
- JZOJ 100036 【NOIP2017提高A组模拟7.10】随机
- 错误解决方案__20161031重仿.png
- Learning Python Part II 之 作用域(scope)
- KMP求最小覆盖子矩阵
- ubuntu中默认Python2和Python3的转换命令
- CodeForces 867B Save the problem!
- JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph
- Python 用栈模拟递归
- js原型链
- Leetcode 算法习题 第六周
- Appium Appium 文档翻译计划 2017 完成!
- 实现一个函数判断year是不是闰年。
- FastDFS学习
- 海康笔试题--字符串分割
- [Codeforces 295B]Greg and Graph(Floyd)