给定一张 $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. docker 实践一:简介和安装

    docker 的简介 docker 绝对是这几年来的重量级开源软件,它是使用 Go 实现的开源容器项目,分属于虚拟化技术. docker 和 虚拟机 docker 作为一种轻量级的虚拟化方式,在运行应 ...

  2. (三)ActiveMQ之发布- 订阅消息模式实现

    一.概念 发布者/订阅者模型支持向一个特定的消息主题发布消息.0或多个订阅者可能对接收来自特定消息主题的消息感兴趣.在这种模型下,发布者和订阅者彼此不知道对方.这种模式好比是匿名公告板.这种模式被概括 ...

  3. Spring Boot 默认首页

    //继承 WebMvcConfigurerAdapter @Override public void addViewControllers(ViewControllerRegistry registr ...

  4. wstngfw中配置snort

    wstngfw中配置snort 概述 Snort是入侵检测和预防系统.它可以将检测到的网络事件记录到日志并阻止它们.Snort使用称为规则的检测签名进行操作. Snort规则可以由用户自定义创建,或者 ...

  5. Go part 1 初探

    Go 语言简介 Go 语言是 Google 在2007年开发的一种开源编程语言,于2009年11月10日向全球公布 出自 Ken Thompson 和 Rob Pike.Robert Grieseme ...

  6. pytorch之nn.Conv1d详解

    转自:https://blog.csdn.net/sunny_xsc1994/article/details/82969867,感谢分享 pytorch之nn.Conv1d详解

  7. 超详细的Java面试题总结之JavaWeb基础知识总结

    ervlet总结: 在Java Web程序中,Servlet主要负责接收用户请求HttpServletRequest,在doGet(),doPost()中做相应的处理,并将回应HttpServletR ...

  8. 深度学习_1_Tensorflow_2_数据_文件读取

    tensorflow 数据读取 队列和线程 文件读取, 图片处理 问题:大文件读取,读取速度, 在tensorflow中真正的多线程 子线程读取数据 向队列放数据(如每次100个),主线程学习,不用全 ...

  9. springboot系列(四)springboot 配置

    在springboot出现之前,spring项目会存在多个配置文件,如web.xml,配置spring的多个spring-xxx.xml,xxx代表配置spring的某一功能,如aplication- ...

  10. C#开发windows服务如何调试——资料整理

    原文标题:C# Windows服务程序如何进行调试 原文地址:https://jingyan.baidu.com/article/456c463b18e1b00a583144b3.html 第一种: ...