题目描述:

有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。

一共两个子任务:

  1. 这张图是无向图。(50 分)

  2. 这张图是有向图。(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。

  1. 如果 t=1t = 1t=1 则表示 viv_ivi​ 到 uiu_iui​ 有一条无向边。

  2. 如果 t=2t = 2t=2 则表示 viv_ivi​ 到 uiu_iui​ 有一条有向边。

图中可能有重边也可能有自环。

输出格式:

如果不可以一笔画,输出一行 NO

否则,输出一行 YES,接下来一行输出一组方案。

  1. 如果 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​。

  2. 如果 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 欧拉回路的更多相关文章

  1. UOJ117. 欧拉回路【欧拉回路模板题】

    LINK 题目大意 就是让你对有向图和无向图分别求欧拉回路 非常的模板,但是由于UOJ上毒瘤群众太多了 所以你必须加上一个小优化 就是每次访问过一个边就把它删掉 有点像Dinic的当前弧优化的感觉 注 ...

  2. UOJ117 欧拉回路[欧拉回路]

    找欧拉回路的模板题. 知识点详见图连通性学习笔记. 注意一些写法上的问题. line37&line61:因为引用,所以j和head值是同步更新的,类似于网络流的当前弧优化,除了优化枚举外,这样 ...

  3. 图论杂项细节梳理&模板(虚树,圆方树,仙人掌,欧拉路径,还有。。。)

    orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...

  4. 欧拉回路 uoj117

    写了一道欧拉回路的模板题.先判断是否是欧拉回路,有向图和无向图有一点点不同,然后就是特判独立点的存在. 之后是输出路径,和dls学的dfs,利用last数组的更新可以做到线性的复杂度,否则一不小心就会 ...

  5. UOJ117:欧拉回路——题解

    http://uoj.ac/problem/117 (作为一道欧拉回路的板子题,他成功的令我学会了欧拉回路) (然而我不会背……) 就两件事: 1.无向图为欧拉图,当且仅当为连通图且所有顶点的度为偶数 ...

  6. 算法复习——欧拉回路(uoj117)

    题目: 题解: 欧拉回路相关定理(相关定义和证明请参见其他资料): 1.欧拉回路 (1)有向图:所有点的出度都等于入度为该图为欧拉图(存在欧拉回路)的充要条件. (2)无向图:所有点的度都为偶数为该图 ...

  7. 求欧拉回路 UOJ117

    传送门什么是欧拉回路呢……?欧拉回路的定义就是从vi出发到vi,经过每条边有且只有一次的路径. 就很像一笔画. 欧拉回路的性质较多……定理也很多……直接证明很长……我们还是直接说怎么判定,怎么求欧拉回 ...

  8. 【UOJ117】 欧拉回路(欧拉回路)

    传送门 UOJ Solution 无解 t=1,无向图,当且仅当\(\exists i \ \ in_i \ne out_i\) t=2,有向图,当且仅当\(\exists i \ \ in_i是奇数 ...

  9. ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)

    //网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Me ...

随机推荐

  1. jQuery domready

    在jQuery里面,我们可以看到两种写法: $(function(){ //todo }) $(document).ready(function(){ //todo }) 这两个方法的效果都是一样的, ...

  2. 数据类型的判断 --Object.prototype.toString.call(obj)精准检测对象类型

    数据类型的判断 typeof typeof返回一个表示数据类型的字符串,返回结果包括:number.boolean.string.symbol.object.undefined.function等7种 ...

  3. win32的回调函数

    [转]http://blog.csdn.net/w419675647/article/details/6599070 众所周知,win32的回调函数WndProc()是操作系统调用的函数,win32用 ...

  4. JAVA 之 Tomcat知识框架【转】

    一.Tomcat服务器(很熟悉) 1.Web开发概述 javaSE: javaEE:13种 javaME: JavaEE规范: 13种技术的总称.Servlet/Jsp JDBC JNDI JTA.. ...

  5. ubuntu上安装MySQL详解

     1. 安装 在终端输入 sudo apt-get install mysql-server mysql-client 回车 2.安装完成后检测MySQL的状态 systemctl status my ...

  6. C/C++——C语言数组名与指针

    版权声明:原创文章,转载请注明出处. 1. 一维数组名与指针 对于一维数组来说,数组名就是指向该数组首地址的指针,对于: ]; array就是该数组的首地址,如果我们想定义一个指向该数组的指针,我们可 ...

  7. Android通过NTP服务器取得UTC标准时间

    1. http://hi-android.info/src/android/net/SntpClient.java.html 利用这个类调用NTP函数. 2. 通过函数client.requestTi ...

  8. First Missing Positive——数学类

    转:http://blog.csdn.net/nanjunxiao/article/details/12973173 Given an unsorted integer array, find the ...

  9. html5多媒体Video/Audio

    video:    1.常见的视频格式 视频的组成部分:画面.音频.编码格式 视频编码:H.264.theora.VP8(google开源)      2.常见的音频格式     编码:AAC.MP3 ...

  10. UAF漏洞学习

    产生原因: UAF漏洞的成因是一块堆内存被释放了之后又被使用.又被使用指的是:指针存在(悬垂指针被引用).这个引用的结果是不可预测的,因为不知道会发生什么.由于大多数的堆内存其实都是C++对象,所以利 ...