Weird journey

题目链接http://codeforces.com/contest/788/problem/B

数据范围:略。


题解

我们发现就是要求,把每条无向边拆成两条无向边,其中有两条拆成一条,问这个图有没有欧拉回路。

无向图欧拉回路的充要条件是度数为奇数的点数等于$0$或者$2$。

那么我们的删边方式就分成了三种:

第一种,删任意两个自环。

第二种,删一个自环和任意一条边。

第三种,删两条有公共端点的边,

随便枚举一下就行。

代码

  1. #include <bits/stdc++.h>
  2.  
  3. #define N 1000010
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. char *p1, *p2, buf[100000];
  10.  
  11. #define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
  12.  
  13. int rd() {
  14. int x = 0, f = 1;
  15. char c = nc();
  16. while (c < 48) {
  17. if (c == '-')
  18. f = -1;
  19. c = nc();
  20. }
  21. while (c > 47) {
  22. x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
  23. }
  24. return x * f;
  25. }
  26.  
  27. int n, m, t;
  28.  
  29. ll d[N];
  30.  
  31. int zh[N];
  32.  
  33. bool vis[N];
  34.  
  35. int tot, head[N], nxt[N << 1], to[N << 1];
  36.  
  37. inline void add(int x, int y) {
  38. to[ ++ tot] = y;
  39. nxt[tot] = head[x];
  40. head[x] = tot;
  41. }
  42.  
  43. void dfs(int p) {
  44. vis[p] = true;
  45. for (int i = head[p]; i; i = nxt[i]) {
  46. if (!vis[to[i]]) {
  47. dfs(to[i]);
  48. }
  49. }
  50. }
  51.  
  52. int main() {
  53. n = rd(), m = rd();
  54. for (int i = 1; i <= m; i ++ ) {
  55. int x = rd(), y = rd();
  56. add(x, y), add(y, x);
  57. if (x == y) {
  58. t ++ , zh[x] ++ ;
  59. continue;
  60. }
  61. d[x] ++ , d[y] ++ ;
  62. }
  63. for (int i = 1; i <= n; i ++ ) {
  64. if (d[i]) {
  65. dfs(i);
  66. break;
  67. }
  68. }
  69. for (int i = 1; i <= n; i ++ ) {
  70. if (!vis[i]) {
  71. if (d[i] || zh[i]) {
  72. puts("0");
  73. return 0;
  74. }
  75. }
  76. }
  77. ll ans = 0;
  78. ans += (ll)t * (t - 1) / 2;
  79. ans += (ll)t * (m - t);
  80. for (int i = 1; i <= n; i ++ ) {
  81. if (d[i] >= 2) {
  82. ans += (ll)d[i] * (d[i] - 1) / 2;
  83. }
  84. }
  85. cout << ans << endl ;
  86. return 0;
  87. }

[CF788B]Weird journey_欧拉回路的更多相关文章

  1. CF788B Weird journey

    总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同. 可以把每条边都拆成两条重边,每条边的度数都是偶数了 ...

  2. CF788B Weird journey 欧拉路径+计数

    给定一张 $n$ 个点 $m$ 条无向边的图(无重边) :定义一种行走方案为:$m-2$ 条边走 $2$ 次,其余 $2$ 条边只走一次. 两个行走方案不同,当且仅当走一次的两条边中有不同的. 一条边 ...

  3. 【cf789D】Weird journey(欧拉路、计数)

    cf788B/789D. Weird journey 题意 n个点m条边无重边有自环无向图,问有多少种路径可以经过m-2条边两次,其它两条边1次.边集不同的路径就是不同的. 题解 将所有非自环的边变成 ...

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

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

  5. [poj2337]求字典序最小欧拉回路

    注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识 ...

  6. ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

     FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u P ...

  7. UVA 10054 the necklace 欧拉回路

    有n个珠子,每颗珠子有左右两边两种颜色,颜色有1~50种,问你能不能把这些珠子按照相接的地方颜色相同串成一个环. 可以认为有50个点,用n条边它们相连,问你能不能找出包含所有边的欧拉回路 首先判断是否 ...

  8. POJ 1637 混合图的欧拉回路判定

    题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定 ...

  9. codeforces 723E (欧拉回路)

    Problem One-Way Reform 题目大意 给一张n个点,m条边的无向图,要求给每条边定一个方向,使得最多的点入度等于出度,要求输出方案. 解题分析 最多点的数量就是入度为偶数的点. 将入 ...

随机推荐

  1. 第90节:Java中的Linux基础

    第90节:Java中的Linux基础 linux是装载虚拟机上面的: JDK依赖包: yum install glibc.i686 MYSQL依赖包: yum -y install libaio.so ...

  2. NodeJS后台

    NodeJS后台 后台: 1.PHP 2.Java 3.Python 优势 1.性能 2.跟前台JS配合方便 3.NodeJS便于前端学习 https://nodejs.org/en/ 1.切换盘符 ...

  3. CF1188B Count Pairs

    [题目描述] 给定一个质数 \(p\) , 一个长度为 \(n\)n 的序列 \(a = \{ a_1,a_2,\cdots,a_n\}\)一个整数 \(k\). 求所有数对 \((i, j)\) ( ...

  4. CF463E Caisa and Tree

    要是你们能和我一样看错题目意思误认为是要求互质的就舒服了. 考虑修改很少,所以修改完之后可以暴力遍历树. 那么现在问题转换成了如何求一个点的答案,直接把所有质因子存下来然后用\(set\)维护即可. ...

  5. 实现Runnable接口方式

    package com.roocon.thread.t2; public class Demo2 implements Runnable { @Override public void run() { ...

  6. zoom:1的常见作用

    zoom是IE专用属性,firefox等是不支持的.它的本来作用是设置或检索对象的缩放比例,但这作用几乎用不到. 可以让网页实现IE7中的放大缩小功能.比如你想让你的网页缩小为原来的一半,那么就在bo ...

  7. Java 多线程编程(锁优化)

    转:https://mp.weixin.qq.com/s/lDuguEhuWiLY8ofBRy3tZA 并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问. 加锁会带来性 ...

  8. case设计及验证:入口+页面+展示

    测试个性CB问题, 功能整体结构为:入口+页面+展示 总结: 1. 产品文档为主,其次是服务端接口返回.数据结构及字段值确认.结合实际场景检查是否有遗漏或不合理. 2. 以字段为维度,每个字段的检查点 ...

  9. php的IP转换成整型函数ip2long()易出现负数

    php中将IP转换成整型的函数ip2long()容易出现问题,在IP比较大的情况下,会变成负数.如下<?php$ip = "192.168.1.2";$ip_n = ip2l ...

  10. python socketpool:通用连接池

    简介 在软件开发中经常要管理各种“连接”资源,通常我们会使用对应的连接池来管理,比如mysql数据库连接可以用sqlalchemy中的池来管理,thrift连接可以通过thriftpool管理,red ...