CF36 E Two Paths——欧拉(回)路
题目:http://codeforces.com/contest/36/problem/E
给定一张无向图,要求输出两条欧拉路覆盖所有边;
分类讨论,首先判-1:有两个以上连通块 / 有四个以上奇度数点 / 只有一条边 / 有两个连通块而其中一个连通块里有四个奇度数点 (/ 有连通块里有奇数个奇度数点);
然后分两个连通块和一个连通块的情况进行 dfs 找欧拉路(模板 dfs );
注意可能没有奇度数的点,也就是有欧拉回路,所以不仅找奇度数点进行 dfs ,还要在那之后 dfs 仍然没有被走过的点;
明明是模仿题解写的竟然还调了两小时...码力++...
代码如下:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int const maxn=;
- int n,m,d[maxn],ans[maxn],tot,fa[maxn],cnt,c[maxn],hd[maxn],ct=;
- bool vis[maxn],used[maxn];
- struct N{
- int to,nxt;
- N(int t=,int n=):to(t),nxt(n) {}
- }ed[maxn<<];
- void add(int x,int y){ed[++ct]=N(y,hd[x]); hd[x]=ct;}
- int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
- void dfs(int x)
- {
- vis[x]=;
- for(int i=hd[x];i;i=hd[x])
- {
- hd[x]=ed[i].nxt;
- if(used[i>>])continue;
- used[i>>]=; dfs(ed[i].to); ans[++tot]=(i>>);
- }
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- n=; scanf("%d",&m);//不能是 n=10005
- for(int i=;i<=n;i++)fa[i]=i;//!!
- for(int i=,x,y;i<=m;i++)
- {
- scanf("%d%d",&x,&y);
- add(x,y); add(y,x); d[x]++; d[y]++;
- if(find(x)!=find(y))fa[find(x)]=find(y);
- }
- for(int i=;i<=n;i++) if(d[i]&) c[find(i)]++;
- for(int i=;i<=n;i++) if(c[i]&){printf("-1\n"); return ;}
- for(int i=,sum=;i<=n;i++)
- {
- if(d[i])cnt+=(i==find(i));
- if(c[i])sum+=c[i];
- if(sum>){printf("-1\n"); return ;}
- }
- if(cnt>){printf("-1\n"); return ;}
- if(cnt==)
- {
- for(int i=;i<=n;i++) if(c[i]==){printf("-1\n"); return ;}
- for(int i=;i<=n;i++)
- if(!vis[i]&&(d[i]&))
- {
- tot=; dfs(i); printf("%d\n",tot);
- for(int j=tot;j;j--)printf("%d ",ans[j]); printf("\n");
- }
- for(int i=;i<=n;i++)//欧拉回路
- if(!vis[i]&&d[i])
- {
- tot=; dfs(i); printf("%d\n",tot);
- for(int j=tot;j;j--)printf("%d ",ans[j]); printf("\n");
- }
- }
- else
- {
- bool fl=;
- for(int i=;i<=n;i++) if(c[i]==)fl=;
- if(fl)
- {
- for(int i=;i<=n;i++) if(d[i]&)
- {
- for(int j=i+;j<=n;j++)
- if(d[j]&){d[i]++; d[j]++; add(i,j); add(j,i); break;}
- break;
- }
- for(int i=;i<=n;i++)
- if(!vis[i]&&(d[i]&)){tot=; dfs(i); break;}
- for(int i=;i<=tot;i++) if(ans[i]==m+)
- {
- printf("%d\n",i-);
- for(int j=;j<i;j++)printf("%d ",ans[j]); printf("\n");
- printf("%d\n",tot-i);
- for(int j=i+;j<=tot;j++)printf("%d ",ans[j]);
- break;
- }
- }
- else
- {
- for(int i=;i<=n;i++)
- if(!vis[i]&&(d[i]&)){tot=; dfs(i);}
- for(int i=;i<=n;i++)//欧拉回路
- if(!vis[i]&&d[i]){tot=; dfs(i);}
- if(tot<=){printf("-1\n"); return ;}//只有一条边
- printf("1\n%d\n%d\n",ans[],tot-);
- for(int i=;i<=tot;i++)printf("%d ",ans[i]);
- }
- }
- return ;
- }
CF36 E Two Paths——欧拉(回)路的更多相关文章
- 拓扑排序&&欧拉(回)路
摘要:最近是不适合写代码么?忘记初始化wa到死<_=_=_>.唔--最近在学习图论,从基础搞起,先搞了拓扑排序和欧拉(回)路. Part 0. 拓扑排序 ==挖坑== Part 1. 欧拉 ...
- Codeforces 871D Paths (欧拉函数 + 结论)
题目链接 Round #440 Div 1 Problem D 题意 把每个数看成一个点,如果$gcd(x, y) \neq 1$,则在$x$和$y$之间连一条长度为$1$的无向边. ...
- Poj 2337 Catenyms(有向图DFS求欧拉通路)
题意: 给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条. 分析: 这题可以看作http://www.cnblogs.com/Jadon97 ...
- POJ 2337 Catenyms(有向图的欧拉通路)
题意:给n个字符串(3<=n<=1000),当字符串str[i]的尾字符与str[j]的首字符一样时,可用dot连接.判断用所有字符串一次且仅一次,连接成一串.若可以,输出答案的最小字典序 ...
- HDU1116 Play on Words(有向图欧拉通路)
我把单词当作点,然后这样其实是不对的,这样就要判定是否是哈密顿通路.. 这题应该把单词的首尾单词当作点,而单词本身就是边,那样就是判定欧拉通路了. 有向图包含欧拉通路的充要条件是:首先基图连通,然后是 ...
- POJ 1386 有向图欧拉通路
题意:给你一些字符串,这些字符串可以首位相接(末位置如果和另一个字符串的首位置相同的话就可以相连) .然后问你是否可以全部连起来. 思路:就是取出每个字符串的首尾位置,然后求出出度和入度,根据有向欧拉 ...
- UVA 10129-Play on Words(欧拉通路)
题意:给N个单词,判断是否单词首尾(前一个单词的尾字符与后一个单词的头字符相同)相连能否形成一条链. 解析:找欧拉通路(欧拉回路或是欧拉链路),但这题事先需要并查集一下,判断是否只属于一个集合,如aa ...
- CodeForces - 508D Tanya and Password(欧拉通路)
Description While dad was at work, a little girl Tanya decided to play with dad characters. She has ...
- POJ--1300--Door Man【推断无向图欧拉通路】
链接:http://poj.org/problem?id=1300 题意:有n个房间.每一个房间有若干个门和别的房间相连.管家从m房间開始走.要回到自己的住处(0),问是否有一条路能够走遍全部的门而且 ...
随机推荐
- windows10下win+R快速打开程序
按下win+R进入运行窗口,输入应用程序名称按下回车键 即可打开该应用,若提示“windows找不到文件”,请看下一步 可以采用建立统一的目录管理,新建目录“F:/local/bin” 将新建目录的路 ...
- Luogu P4316 绿豆蛙的归宿
P4316 绿豆蛙的归宿 题意翻译 「Poetize3」 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边 ...
- Cmake的介绍和使用 Cmake实践
Cmake的介绍和使用 Cmake实践http://www.cppblog.com/Roger/archive/2011/11/17/160368.html
- 多校1010 Taotao Picks Apples
>>点击进入原题<< 思路:题解很有意思,适合线段树进阶 #include<cstdio> #include<cmath> #include<cs ...
- atCoder Ants on a Circle(又是蚂蚁问题。。。)
atCoder Ants on a Circle(又是蚂蚁问题...) 传送门 题意:一个圈,蚂蚁在上面以相同的速度和不同的方向走,问t秒后它们各自的位置. 解法:和经典的蚂蚁问题一致,把相撞的情况看 ...
- Discuz论坛迁移需要修改的3个配置文件
需要修改的3个地方: \config\config_global.php \config\config_ucenter.php \uc_server\data\config.inc.php
- 【11】AngularJS HTML DOM
AngularJS HTML DOM AngularJS 为 HTML DOM 元素的属性提供了绑定应用数据的指令. ng-disabled 指令 ng-disabled 指令直接绑定应用程序数据到 ...
- Docker学习总结(17)——学会使用Dockerfile
Docker.Dockerfile.Docker镜像.容器这些都是什么鸟? 老生常谈,再再再--普及一下: Docker: 最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起 ...
- 定时任务-----Springboot中使用Scheduled做定时任务----http://www.cnblogs.com/lirenqing/p/6596557.html
Springboot中使用Scheduled做定时任务---http://www.cnblogs.com/lirenqing/p/6596557.html 已经验证的方案: pom文件加入依赖 < ...
- XOR的艺术
题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[l,r ...