题目链接:传送门

思路:

(1)用邻接表存储有向图和无向图,有向图和无向图的每条边均站两个单元,无向图有正向边和反向边的区分。

(2)有向图有欧拉回路:所有点的入度=出度;

无向图有欧拉回路:所有点的度数之和是2的倍数。

(3)搜索时要从存在的点开始搜索,注意每条边站两个单位,所以i/2。

(4)搜索的结果路径必须包含所有边,如果图不连通则不行。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<vector>
  5. using namespace std;
  6. const int maxn = ;
  7. struct Node{
  8. int to,next,val;
  9. }edge[maxn*];
  10. int vis[maxn],head[maxn],IN[maxn],OUT[maxn],tot;
  11. vector <int> ans;
  12. void Init()
  13. {
  14. memset(vis,,sizeof(vis));
  15. memset(head,,sizeof(head));
  16. memset(IN,,sizeof(IN));
  17. memset(OUT,,sizeof(OUT));
  18. tot=;ans.clear();
  19. }
  20. void addedge(int u,int v,int w)
  21. {
  22. edge[tot].to=v;
  23. edge[tot].next=head[u];
  24. edge[tot].val=w;
  25. head[u]=tot++;
  26. }
  27. void dfs(int u)
  28. {
  29. for(int &i=head[u];i;i=edge[i].next){ //对i引用,提高速度
  30. Node tmp=edge[i];
  31. if(!vis[i>>]){
  32. vis[i>>]=;
  33. dfs(tmp.to);
  34. ans.push_back(tmp.val);
  35. }
  36. }
  37. }
  38. int main(void)
  39. {
  40. int n,m,i,j,x,y,type,fg=;
  41. scanf("%d%d%d",&type,&n,&m);
  42. Init();
  43. for(i=;i<=m;i++){
  44. scanf("%d%d",&x,&y);
  45. addedge(x,y,i);
  46. IN[y]++;OUT[x]++;
  47. if(type==) addedge(y,x,-i);
  48. else tot++;
  49. }
  50.  
  51. if(type==){
  52. for(i=;i<=n;i++)
  53. if((IN[i]+OUT[i])%){
  54. fg=;break;
  55. }
  56. }else{
  57. for(i=;i<=n;i++)
  58. if(IN[i]!=OUT[i]){
  59. fg=;break;
  60. }
  61. }
  62.  
  63. if(fg){
  64. for(i=;i<=n;i++) //找到图中存在的点
  65. if(head[i]){
  66. dfs(i);break;
  67. }
  68. if(ans.size()!=m) printf("NO\n");
  69. else{
  70. printf("YES\n");
  71. for(i=m-;i>=;i--){
  72. if(i!=m-) printf(" ");
  73. printf("%d",ans[i]); //ans相当于栈,所以倒叙输出
  74. }
  75. }
  76. }else printf("NO\n");
  77. return ;
  78. }

参考文章:传送门

LOJ-10105(欧拉回路模板,套圈法,递归)的更多相关文章

  1. UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)

    题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...

  2. UVA10054-The Necklace(无向图欧拉回路——套圈算法)

    Problem UVA10054-The Necklace Time Limit: 3000 mSec Problem Description Input The input contains T t ...

  3. uva11549 Floyd判圈法

    题意: 给两个数n, k,每次将k平方取k的前n位,问所有出现过的数的最大值 原来这就是floyd判圈法.. #include<cstdio> #include<cstdlib> ...

  4. 破圈法求解最小生成树c语言实现(已验证)

    破圈法求解最小生成树c语言实现(已验证) 下面是算法伪代码,每一个算法都取一个图作为输入,并返回一个边集T. 对该算法,证明T是一棵最小生成树,或者证明T不是一棵最小生成树.此外,对于每个算法,无论它 ...

  5. POJ 2135.Farm Tour 消负圈法最小费用最大流

    Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4914   Accepted: 1284   ...

  6. CF F. MST Unification (最小生成树避圈法)

    题意 给一个无向加权联通图,没有重边和环.在这个图中可能存在多个最小生成树(MST),你可以进行以下操作:选择某条边使其权值加一,使得MST权值不变且唯一.求最少的操作次数. 分系:首先我们先要知道为 ...

  7. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...

  8. 聊聊 C# 和 C++ 中的 泛型模板 底层玩法

    最近在看 C++ 的方法和类模板,我就在想 C# 中也是有这个概念的,不过叫法不一样,人家叫模板,我们叫泛型,哈哈,有点意思,这一篇我们来聊聊它们底层是怎么玩的? 一:C++ 中的模板玩法 毕竟 C+ ...

  9. hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)

     题目链接 /* 模板题-------判断欧拉回路 欧拉路径,无向图 1判断是否为连通图, 2判断奇点的个数为0 */ #include <iostream> #include <c ...

随机推荐

  1. RE validator

    package com.office.utility;   import java.util.regex.Pattern;   /**  * 校验器:利用正则表达式校验邮箱.手机号等  *  * @a ...

  2. 通过spark sql 将 hdfs上文件导入到mongodb

    功能:通过spark sql 将hdfs 中文件导入到mongdo 所需jar包有:mongo-spark-connector_2.11-2.1.2.jar.mongo-java-driver-3.8 ...

  3. HashMap与Hashtable

    1. 1)       Hashtable继承自Dictionary类,HashMap是map接口的一个实现类(继承自AbstractMap抽象类) 2)       在HashMap中,null可以 ...

  4. Vue 封装的loading组件

    <template> <div class="loadEffect"> <span></span> <span>< ...

  5. node.js获取本机Ip, hostName, mac

    //获取ip地址 getIPAdress() { let interfaces = require('os').networkInterfaces(); for (var devName in int ...

  6. python的相对导入

    最近断断续续学习flask,学到蓝本时候有点小问题卡住了,问题如下 导入包的时候py文件里使用了相对路径导入,但是这种导入方法不是很明白,就自己搜索加实验了终于有点眉目了 先定义一个包 adb包 这个 ...

  7. Hibernate 再接触 性能优化

    Sessionclear 否则session缓存里越来越多 Java有内存泄露吗? 在语法中没有(垃圾自动回收) 但是在实际中会有 比如读文件没有关什么的 1+N问题 解决方法:把fetch设置为la ...

  8. java学习笔记(十):scanner输入

    可以通过 Scanner 类来获取用户的输入. 通过next()类和nextLine()类来获取字符串. 通过 Scanner 类的 next() 类来获取输入的字符串. import java.ut ...

  9. python 安装包制作

    1. __init__.py 2.模块1 模块2 3.setup.py from distutils.core import setup setup(name='modules_name',versi ...

  10. 整数中1出现的次数(从1到n整数中1出现的次数)(python)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...