欧拉回路就是用一笔走过所有的路,现在让你判断到底有几个欧拉回路,也就是说走一个图需要用几笔。

传送门QAQ

首先根据给出的边我们只需要分别处理每个连通分量需要多少笔即可.

如果该连通分量是一个孤立的点,显然只需要0笔.

如果该连通分量是一个欧拉图或半欧拉图,只需要1笔.

现在关键是连通分量并非一个(半)欧拉图时,需要几笔?

一般性的结论是:

非(半)欧拉图需要的笔数==该图中奇数度的点数目/2

下面来证明该结论:

首先一个无向图的连通分量中的奇数度的点个数一定是偶数个(成对出现),因为无向图的总度数=偶数.

我们在这种连通分量中每次画一笔有两种选择:

1.a->b->c->d…->g    一条起点与终点不同的路径(路中除首尾度减1外,每个点度减2)

2.a->b->c->d…->a    一条起点与终点相同的回路(路中每个点度数减2)

也就是说想要把非(半)欧拉图分量中的奇数度的点的度数都变成偶数,我们至少需要画奇数度点个数/2 笔.

那么对于这种图我们最多需要画的笔数 是不是也是 : 奇数度点个数/2 笔呢?

答案是肯定的,这里假设图中有4个奇数度的点,1,2,3,4,5,6.如下图所示:

我们先走路:1-> b-> c-> d-> e-> f->a-> 2 这条路.然后6,5 和3,4 分别属于两个连通分量了.可以看出只需要3笔,即6/2=3即可.

也就是说对于这种非(半)欧拉图的连通分量,我们每笔必然消除正好2个点的奇度(使其度变偶数),当最后一笔的时候我们必然消除所有的点的度数(包括剩下的两个奇点,因为最后一笔就必然是欧拉通路).但是有一点要注意,有可能过程中的某几笔会使得该连通分量变成多个连通分量,当然结论不变.

经过上面的分析,这题的结论出来了,对于每个以i为根的连通分量我们记录属于该连通分量的点数目num[i]和该连通分量中奇度点的个数odd[i].

如果num[i]==0或1,需0笔.(注意num[i]==0表示i点不是根,num[i]==1表示i点是一个孤立的点.)

如果num[i]>1且odd[i]==0 需1笔

如果num[i]>1且odd[i]>0 需odd[i]/2笔

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<map>
 6 #include<set>
 7 #include<vector>
 8 #include<queue>
 9 #include<algorithm>
10 #include<cmath>
11 using namespace std;
12 #define ll long long
13 const int N = 100000 + 10;
14 int n, m,xx,yy;
15 int fa[N], indu[N], odd[N],num[N];
16 int find(int x)
17 {
18     if (fa[x] == -1)    return x;
19     return fa[x] = find(fa[x]);
20 }
21 void hebing(int a, int b)
22 {
23     a = find(a);
24     b = find(b);
25     if(a!=b)
26         fa[a] = b;
27 }
28 int main()
29 {
30     while (scanf("%d %d", &n, &m) != EOF)
31     {
32         memset(fa, -1, sizeof(fa));
33         memset(indu, 0, sizeof(indu));
34         memset(odd, 0, sizeof(odd));
35         memset(num, 0, sizeof(num));
36         while (m--)
37         {
38             scanf("%d %d",&xx,&yy);
39             indu[xx]++;
40             indu[yy]++;
41             hebing(xx, yy);
42         }
43         for (int i = 1; i <= n; i++)
44         {
45             num[find(i)]++;
46             if (indu[i] % 2 == 1)
47                 odd[find(i)]++;
48         }
49         int ans = 0;
50         for (int i = 1; i <= n; i++)
51         {
52             if (num[i] <= 1)    continue;
53             if (odd[i] == 0)    ans += 1;
54             else ans += odd[i] / 2;
55         }
56         printf("%d\n",ans);
57     }
58
59     return 0;
60 }

View Code

转载于:https://www.cnblogs.com/Kaike/p/10417939.html

[图论]欧拉回路的个数相关推荐

  1. 图论欧拉回路初步 BZOJ2095 POI2010 Bridges

    反正对于现在的我来说是好题.顺便膜po大犇和dingchao大犇. 网络流什么的还是再开一个专题好了. 欧拉回路问题参考论文<欧拉回路性质与应用探究>by 仇荣琦. POI2010 题解整 ...

  2. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1123. 铲雪车:披着欧拉回路外衣的小学数学题

    文章目录 题目解答 无向图的一笔画 有向图的一笔画 题目来源 题目解答 来源:acwing 分析: 对于一个给定的图,怎样判断是否存在着一个恰好包含了所有的边,并且没有重复的路径?这就是一笔画问题.用 ...

  3. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1124. 骑马修栅栏:欧拉路径、dfs

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 本题是无向图的欧拉路,要输出字典序最小的欧拉路. 如何输出字典序最小的路径? 从最小的点开始搜,这样得到的欧拉路是字典序最小的. 无 ...

  4. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1184. 欧拉回路:有向图和无向图的欧拉回路

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 无向图欧拉回路:1)所有点的度都为偶数:2)所有边连通 有向图欧拉回路:1)所有点的入度等于出度:2)所有边连通 AC代码 #inc ...

  5. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1185. 单词游戏:判断有向图是否存在欧拉路径、并查集

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 把每个单词看成一条边!!!首字母到尾字母的一条边,最多共有26个点(26个小写的英文字母),然后问能否把所有边串起来. 其实,对欧拉 ...

  6. 图论--欧拉回路--弗罗莱算法模板

    void fleury(int s){bool flag;st.push(s);while(!st.empty()){flag = 0;for(int i = 1; i <= n; i++){i ...

  7. 图论--欧拉回路(模板)

    int g[510][510]; stack<int> s; int d[510]; void euler(int u) {for(int v=1; v<=500; v++){if( ...

  8. 靠二进制画几何[图论]

    @Kaike 今天来浅谈一下图,听说自己写总结的人grade++,rp++. 像我这样可爱的人怎么能错过这个机会呢嘤嘤嘤. 毕竟图至少啃了15day++. 恩曾经的小弱渣从来都是仰望高端玩家虐图论 听 ...

  9. 并查集---找朋友圈个数问题,连通度问题,等的有效算法

    数据结构方面,你了解并查集么? 上交05年计算机复试 上机 畅通工程问题: 例题1 修路连通问题 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通 ...

最新文章

  1. Entity SQL Language 三 Where/Exists/In/Like/参数及外键查询
  2. Eclipse上搭建SSH(struts-2.2.3 + spring-2.5.6 + hibernate-3.6.8)框架-附源码
  3. 数据库系统概念总结:第三章 SQL
  4. 猴子偷桃php代码,C++实现猴子吃桃的示例代码
  5. 用C#完成Swift远程推送通知
  6. C++ string类常用函数
  7. 我的世界1.14java原版命令_我的世界:老一辈mc是怎么生存的?鱼骨式挖矿,这些套路你知道吗...
  8. 算法取代了保释金:被抓能不能保释?先听系统怎么说
  9. React - 修改children(下)
  10. css参考-img标签
  11. xp系统显示无打印机服务器,XP没有打印机print spooler服务的解决方法
  12. 线性插值法(一次插值多项式)的Python程序
  13. matlab洛伦兹吸引子,用Matlab求解洛伦兹方程
  14. 超详细的Mac重装系统教程!让重装系统变得简单起来!
  15. java怎么重新开始游戏_添加开始,停止,重置按钮到简单的Java游戏
  16. Linux安装应用时需要考虑时区问题并修改时区
  17. office安装错误“错误25004,您输入的产品密钥无法在此计算机上使用,-----------”
  18. VS-( 图片的上传 )
  19. Automatic Targetless LiDAR-CameraCalibration: A Survey论文解读
  20. win10升级win11操作

热门文章

  1. 全面 Severless 化只需要 7天!
  2. 广播电视加速技术迭代,用新技术拥抱行业转型
  3. 一文揭秘阿里实时计算Blink核心技术:如何做到唯快不破?
  4. 从零点五开始用Unity做半个2D战棋小游戏(四)
  5. SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)
  6. 三星I9100[4.0 固件ROM] [2012.03.15]万众期待的欧版官方4.0.3完美汉化完美教程
  7. 重建控制文件的案例(RESETLOGS模式和NORESETLOGS模式)
  8. 从DUMP函数说开去
  9. 有关UNLIMITED TABLESPACE权限
  10. 阿里、美团、拼多多、网易大厂面试之Redis+多线程+JVM+微服务...