uoj117 欧拉回路
题目描述:
有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。
一共两个子任务:
这张图是无向图。(50 分)
这张图是有向图。(50 分)
输入格式:
第一行一个整数 ttt,表示子任务编号。t∈{1,2}t \in \{1, 2\}t∈{1,2},如果 t=1t = 1t=1 则表示处理无向图的情况,如果 t=2t = 2t=2 则表示处理有向图的情况。
第二行两个整数 n,mn, mn,m,表示图的结点数和边数。
接下来 mmm 行中,第 iii 行两个整数 vi,uiv_i, u_ivi,ui,表示第 iii 条边(从 111 开始编号)。保证 1≤vi,ui≤n1 \leq v_i, u_i \leq n1≤vi,ui≤n。
如果 t=1t = 1t=1 则表示 viv_ivi 到 uiu_iui 有一条无向边。
如果 t=2t = 2t=2 则表示 viv_ivi 到 uiu_iui 有一条有向边。
图中可能有重边也可能有自环。
输出格式:
如果不可以一笔画,输出一行 NO
。
否则,输出一行 YES
,接下来一行输出一组方案。
如果 t=1t = 1t=1,输出 mmm 个整数 p1,p2,…,pmp_1, p_2, \dots, p_mp1,p2,…,pm。令 e=∣pi∣e = \lvert p_i \rverte=∣pi∣,那么 eee 表示经过的第 iii 条边的编号。如果 pip_ipi 为正数表示从 vev_eve 走到 ueu_eue,否则表示从 ueu_eue 走到 vev_eve。
如果 t=2t = 2t=2,输出 mmm 个整数 p1,p2,…,pmp_1, p_2, \dots, p_mp1,p2,…,pm。其中 pip_ipi 表示经过的第 iii 条边的编号。
根据题目名称我们得知这道题是一道判断欧拉回路的板子题,那么怎么判欧拉回路?
如果这个图是无向图,那么对于每个点,它的度都要是偶数。然后路径就是在这个图上随便找一个点开始,随便跑,只要不重复就行。
如果这个图是有向图,那么对于每个店,它的入度和出度要一样。然后从图上一个有出边的点遍历。
就是要注意无向图时,如果a->b这条边跑过了,那么b->a这条边也要标记,而且存边时也要注意细节。
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #define in(a) a=read()
- #define REP(i,k,n) for(int i=k;i<=n;i++)
- #define MAXN 2000010
- using namespace std;
- inline int read(){
- int x=,t=,c;
- while(!isdigit(c=getchar())) if(c=='-') t=-;
- while(isdigit(c)) x=x*+c-'',c=getchar();
- return x*t;
- }
- int t,n,m;
- int total=,head[MAXN],to[MAXN<<],nxt[MAXN<<];
- int ans[MAXN<<],ind,vis[MAXN<<];
- int In[MAXN],out[MAXN],du[MAXN];
- inline void adl(int a,int b){
- total++;
- to[total]=b;
- nxt[total]=head[a];
- head[a]=total;
- return ;
- }
- inline void dfs(int u){
- for(int &e=head[u];e;e=nxt[e])
- if(!vis[e]){
- int k=e;
- vis[e]=;
- if(t==){//标记细节
- if(e%) vis[e+]=;
- else vis[e-]=;
- }
- dfs(to[e]);
- ans[++ind]=k;
- }
- return ;
- }
- int main(){
- in(t),in(n),in(m);
- int a,b;
- if(t==){
- REP(i,,m)
- in(a),in(b),du[a]++,du[b]++,adl(a,b),adl(b,a);
- REP(i,,n)
- if(du[i]%){
- cout<<"NO"<<endl;
- return ;
- }
- }
- if(t==){
- REP(i,,m)
- in(a),in(b),In[b]++,out[a]++,adl(a,b);
- REP(i,,n)
- if(In[i]!=out[i]){
- cout<<"NO"<<endl;
- return ;
- }
- }
- REP(i,,n)
- if(head[i]){
- dfs(i);
- break;
- }
- if(ind!=m){
- cout<<"NO";
- return ;
- }
- cout<<"YES"<<endl;
- if(t==){
- REP(i,,ind-)
- printf("%d ",ans[ind-i]);
- return ;
- }
- REP(i,,ind-){
- if(ans[ind-i]%) printf("%d ",(ans[ind-i]+)/);//输出细节
- else printf("%d ",ans[ind-i]/(-));
- }
- return ;
- }
uoj117 欧拉回路的更多相关文章
- UOJ117. 欧拉回路【欧拉回路模板题】
LINK 题目大意 就是让你对有向图和无向图分别求欧拉回路 非常的模板,但是由于UOJ上毒瘤群众太多了 所以你必须加上一个小优化 就是每次访问过一个边就把它删掉 有点像Dinic的当前弧优化的感觉 注 ...
- UOJ117 欧拉回路[欧拉回路]
找欧拉回路的模板题. 知识点详见图连通性学习笔记. 注意一些写法上的问题. line37&line61:因为引用,所以j和head值是同步更新的,类似于网络流的当前弧优化,除了优化枚举外,这样 ...
- 图论杂项细节梳理&模板(虚树,圆方树,仙人掌,欧拉路径,还有。。。)
orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...
- 欧拉回路 uoj117
写了一道欧拉回路的模板题.先判断是否是欧拉回路,有向图和无向图有一点点不同,然后就是特判独立点的存在. 之后是输出路径,和dls学的dfs,利用last数组的更新可以做到线性的复杂度,否则一不小心就会 ...
- UOJ117:欧拉回路——题解
http://uoj.ac/problem/117 (作为一道欧拉回路的板子题,他成功的令我学会了欧拉回路) (然而我不会背……) 就两件事: 1.无向图为欧拉图,当且仅当为连通图且所有顶点的度为偶数 ...
- 算法复习——欧拉回路(uoj117)
题目: 题解: 欧拉回路相关定理(相关定义和证明请参见其他资料): 1.欧拉回路 (1)有向图:所有点的出度都等于入度为该图为欧拉图(存在欧拉回路)的充要条件. (2)无向图:所有点的度都为偶数为该图 ...
- 求欧拉回路 UOJ117
传送门什么是欧拉回路呢……?欧拉回路的定义就是从vi出发到vi,经过每条边有且只有一次的路径. 就很像一笔画. 欧拉回路的性质较多……定理也很多……直接证明很长……我们还是直接说怎么判定,怎么求欧拉回 ...
- 【UOJ117】 欧拉回路(欧拉回路)
传送门 UOJ Solution 无解 t=1,无向图,当且仅当\(\exists i \ \ in_i \ne out_i\) t=2,有向图,当且仅当\(\exists i \ \ in_i是奇数 ...
- ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)
//网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Me ...
随机推荐
- 向量与矩阵的范数及其在matlab中的用法(norm)
一.常数向量范数 \(L_0\) 范数 \(\Vert x \Vert _0\overset{def}=\)向量中非零元素的个数 其在matlab中的用法: sum( x(:) ~= 0 ) \(L_ ...
- Solaris 系统命令使用说明
1. 查看进程 -- pgreproot@UA4300D-spa:~# pgrep fmd133095root@UA4300D-spa:~# pgrep -l fmd133095 fmdroot@ ...
- virtualenv搭建虚拟环境
最近因为项目需要,要在CentOS 7 上搭建一套开发环境,虽说Python的背后有着庞大的开源社区支持,但是有一个缺点就是每个包的质量都参差不齐,如果我们在工作服务器上去测试安装每个包,就会造成整个 ...
- Mysql储存过程1: 设置结束符与储存过程创建
#显示储存过程 show procedure status; #设置结束符 delimiter $; #创建储存过程 create procedure procedure_name() begin - ...
- 42、和为S的两个数字
一.题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 二.解法 import java.util.ArrayLis ...
- 老版本ubuntu更新源地址以及sources.list的配置方法 转
转自(http://blog.csdn.net/snaking616/article/details/52966634) 1.国内可用的更新源地址: (1)中科大地址 http://mirrors.u ...
- [写出来才有价值系列:node.js]node.js 01-介绍及安装
对于Node.js在百度百科上是这样解释的: Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引 擎执行Javascript的速度 ...
- Reverse Nodes in k-Group——简单的指针问题
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
- jquery文档
http://jquery.cuishifeng.cn/selected_1.html
- Knockout介绍
Knockout.js是什么? Knockout是一款很优秀的JavaScript库,它可以帮助你仅使用一个清晰整洁的底层数据模型(data model)即可创建一个富文本且具有良好的显示和编辑功能的 ...