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

两个行走方案不同,当且仅当走一次的两条边中有不同的.

一条边走两次不好处理,可以将每条无向边拆开,然后将问题转换成:有多少种方案使得图中两条边不走的一笔画?

我们知道,对于无向图一笔画的条件是度数为奇数的点不能超过两个,而我们将所有无向边都拆成两个无向边时所有点度数肯定都是偶数的.

因为所有点度数都是偶数,所以如果拆掉一条边,一定会使这条边相连两点度数都变成奇数.

假如说我们拆掉的边不是自环,那么对于另一条需要被删掉的边,可以是自环也可以是这条边所连两个扩展出的所有边(需抛出掉枚举到的这个,就是 -2)

假如说枚举到的是自环,那么是不改变度数的奇偶性的,剩下的那条边随便选一条就行了,有 $(m-1)$ 种选法.

#include <bits/stdc++.h>
#define N 1000005
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int p[N],deg[N],from[N],to[N],vis[N],n,m;
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
int main()
{
ll ans=0;
int i,j,sum=0,tp=0;
// setIO("input");
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i) p[i]=i;
for(i=1;i<=m;++i)
{
int u,v;
scanf("%d%d",&u,&v);
from[i]=u, to[i]=v;
vis[u]=vis[v]=1;
if(u==v)
{
++sum;
}
else
{
++deg[u], ++deg[v];
u=find(u), v=find(v);
if(u!=v) p[u]=v, tp=v;
}
}
for(i=1;i<=n;++i)
if(vis[i]&&find(i)!=tp)
{
printf("0\n");
return 0;
}
for(i=1;i<=m;++i)
{
if(from[i]==to[i]) ans+=1ll*(m-1);
else
{
ans+=(ll)deg[from[i]]+deg[to[i]]-2+sum;
}
}
printf("%lld\n",ans/2);
return 0;
}

  

CF788B Weird journey 欧拉路径+计数的更多相关文章

  1. CF788B Weird journey

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

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

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

  3. Codeforces Round #407 (Div. 2) D. Weird journey(欧拉路)

    D. Weird journey time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. Codeforces Round #407 (Div. 1) B. Weird journey —— dfs + 图

    题目链接:http://codeforces.com/problemset/problem/788/B B. Weird journey time limit per test 2 seconds m ...

  5. codeforces 407 div1 B题(Weird journey)

    codeforces 407 div1 B题(Weird journey) 传送门 题意: 给出一张图,n个点m条路径,一条好的路径定义为只有2条路径经过1次,m-2条路径经过2次,图中存在自环.问满 ...

  6. CodeForces - 789D Weird journey

    D. Weird journey time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. [CF788B]Weird journey_欧拉回路

    Weird journey 题目链接:http://codeforces.com/contest/788/problem/B 数据范围:略. 题解: 我们发现就是要求,把每条无向边拆成两条无向边,其中 ...

  8. Weird journey CodeForces - 788B (路径计数)

    大意:$n$结点$m$条边无向图, 满足 $(1)$经过$m-2$条边$2$次 $(2)$经过其余$2$条边$1$次 的路径为好路径, 求所有好路径数 相当于边加倍后再删除两条边, 求欧拉路条数 首先 ...

  9. Codeforces 789D Weird journey - 欧拉路 - 图论

    Little boy Igor wants to become a traveller. At first, he decided to visit all the cities of his mot ...

随机推荐

  1. 关于arm 的字节对齐

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  2. JavaScript--Function对象(函数)的声明和作用域

    Funtion 封装了可重复使用的代码块对象,函数名是一个引用函数对象的变量 声明提前:在程序开始执行之前,将var 变量和function函数提前声明 但赋值并不会提前 它的三种创建方法: 创建1 ...

  3. JavaScript--常用对象的属性及方法(1)

    1.Number对象(基本数据类型) Number对象的方法大多是一些强制转换方法,如果转换失败返回NaN,以下举例中用number来代替具体数字: *console.log在控制台输出(键盘F12可 ...

  4. 用js原生加jquery实现下拉跳转至商品详情页,上拉回到商品简介

    在做一个商城的项目时,做到商品详情页的时候需要实现这种下拉跳转到商品详情页加载许多图片,上拉回到商品简介的效果,并且需要用户在滑动时有一种费力的感觉.最初是通过iscroll插件实现的,但这个插件在使 ...

  5. 关于将多个json对象添加到数组中的测试

    如果用数组push添加不到数组中的,这个我也不知道是为什么?然后我选择了另一种发放就是从数组出发,逆向添加 最后的数组是这样的: data1=['公司1','公司2','公司3','公司4']; ar ...

  6. 利用PL/SQL从Oracle数据库导出和导入数据

    转自:https://www.jb51.net/article/109768.htm 本文实例为大家分享了使用PL/SQL从Oracle数据库导出和导入数据的方法,供大家参考,具体内容如下 1.导出数 ...

  7. CAS客户端认证流程

    CAS登陆流程 Step 1:浏览器向CAS客户端发起登陆请求,CAS客户端生成“登陆URL”,并把浏览器重定向到该URL 登陆URL: https://${cas-server-host}:${ca ...

  8. WordPress,SAP Kyma和微信三者的集成

    我们来继续学习如何在实战中使用SAP Kyma. Jerry在之前的文章里,分别介绍了如何本地搭建WordPress实例: 什么?在SAP中国研究院里还需要会PHP开发? 以及如何把这个本地搭建的Wo ...

  9. Vue.js面试题整理(转载)

    一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...

  10. linux cenos开放端口

    问题:8080端口不能访问 解决方案: 第1步 查看阿里云端口是否开放 网络安全>安全组>配置规则>添加入方向 第二步 查看防火墙是否开启(只说开启了防火墙的情况) 查看防火墙状态: ...