题意:给定n个点,m条边,问能否找到多少条符合条件的路径。需要满足的条件:1.经过m-2条边两次,剩下两条边1次  2.任何两条路的终点和起点不能相同。

欧拉路的条件:存在两个或者0个奇度顶点。

思路:首先把给每条边都再增加一条边,所有点的度数都是偶数。每条边分为普通边和自环边。

1.删去两条没有公共顶点的普通边,会有四个点的度数变成奇数,不符合欧拉路。

2.删去两条有公共顶点的普通边,会有两个点的度数成为奇数,符合

2.删去一个自环边和一个普通边,会有两个点的度数成为奇数,符合

4.删去两条自环边,所有顶点的度数全是偶数,符合

在此之前必须保证所有的边是连通的,否则根本不可能走完所有的边。判断连通性可用dfs或者并查集。

AC代码

#include <cstdio>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 1e6 + 5;
vector<int>G[maxn];
int n, m;
int vis[maxn], mark[maxn];
void dfs(int u) {
	vis[u] = 1;
	for(int i = 0; i < G[u].size(); ++i) {
		int v = G[u][i];
		if(!vis[v]) dfs(v);
	}
}
int main() {
	while(scanf("%d%d", &n, &m) == 2) {
		for(int i = 1; i <= n; ++i) G[i].clear();
		memset(mark, 0, sizeof(mark));
		int x, y, loop = 0;
		for(int i = 0; i < m; ++i) {
			scanf("%d%d", &x, &y);
			if(x != y) {
				G[x].push_back(y);
				G[y].push_back(x);
			}
			else {
				++loop;
				mark[x] = 1;
				G[x].push_back(y); //自环
			}
		}
		memset(vis, 0, sizeof(vis));
		for(int i = 1; i <= n; ++i) {
			if(G[i].size()) {
				dfs(i);
				break;
			}
		}
		//是否所有边已经连通
		for(int i = 1; i <= n; ++i) {
			if(G[i].size() && !vis[i]) { //不连通
				printf("0\n");
				return 0;
			}
		}
		LL ans = 0;
		//相邻普通边
		for(int i = 1; i <= n; ++i) {
			int f = G[i].size();
			if(f) {
				if(mark[i]) --f; //减去自环边
				ans += (LL)f * (f-1) / 2;
			}
		}
		ans += (LL)loop * (m-loop); //自环和普通边
		ans += (LL)loop * (loop-1) / 2; //两条自环边
		printf("%lld\n", ans);
	}
	return 0;
} 

如有不当之处欢迎指出!

CodeForces - 788B Weird journey 欧拉路的更多相关文章

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

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

  2. 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 ...

  3. CodeForces 788B - Weird journey [ 分类讨论 ] [ 欧拉通路 ]

    题意: 给出无向图. good way : 仅有两条边只经过一次,余下边全经过两次的路 问你共有多少条不同的good way. 两条good way不同仅当它们所经过的边的集合中至少有一条不同 (很关 ...

  4. CodeForces - 789D Weird journey

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

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

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

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

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

  7. 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 ...

  8. codeforces 407 div1 B题(Weird journey)

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

  9. [cf1038E][欧拉路]

    http://codeforces.com/contest/1038/problem/E E. Maximum Matching time limit per test 2 seconds memor ...

随机推荐

  1. MySQL中union和order by一起使用的方法

    MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage ...

  2. 如何书写优雅、漂亮的SQL脚本?

    本篇来聊聊如何书写漂亮.整洁.优雅的SQL脚本,下面这些是我个人总结.整理出来的.姑且做个抛砖引玉吧,呵呵,欢迎大家一起来讨论.   我们首先来看看一段创建数据表的脚本(如下所示),你是否觉得有什么不 ...

  3. @interface注解类、 @Target:注解的作用目标 @Retention

    public @interface xxx 定义注解 @interface 不是interface,是注解类 是jdk1.5之后加入的,java没有给它新的关键字,所以就用@interface 这么个 ...

  4. IOS 疯狂基础之 页面间跳转

    常用的就两种 一种通过导航,一种直接跳 第一种 直接跳转 思路大致就是new一个目的页面,然后设置下页面跳转动画 中间还可以做点目的页面的数据初始化: ValueInputView *valueVie ...

  5. 刚买个炼狱蝰蛇1800dpi的下完驱动提示没有发现鼠标

    2017-02-19补充:可以下载下面的程序 ,也可以访问 http://cn.razerzone.com/synapse/  下载雷云 也可解决问题 ------------------------ ...

  6. C#基础(四)--值类型和引用类型,栈和堆的含义

    本文主要是讨论栈和堆的含义,也就是讨论C#的两种类据类型:值类型和引用类型: 虽然我们在.net中的框架类库中,大多是引用类型,但是我们程序员用得最多的还是值类型. 引用类型如:string,Obje ...

  7. R语言-单一变量分析

    R语言简介: R语言是一门专用于统计分析的语言,有大量的内置函数和第三方库来制作基于数据的表格 准备工作 安装R语言 https://cran.rstudio.com/bin/windows/base ...

  8. DBCP和C3P0使用--未完善

    一.前言: DBCP和C3PO都可以作为数据连接池, 二. 导入jar包: 三.配置applicationContext.xml文件 配置dbcp <!-- 创建数据源 --> <b ...

  9. C# Ioc 接口注册实例以及注入MVC Controller

    当弄一个小程序时,就忽略了使用Ioc这种手段,作为一个帅气程序员,代码规范,你懂的~,废话不多说,快速搭建一个Ioc接口实例以及直接注入到 MVC Controller 构造函数中如下: MVC in ...

  10. 无线渗透测试之wifi密码破解

    [声明]:本文仅供个人学习使用,请勿违法破解他人wifi 测试工具: 1.CDlinux启动盘:(请参照https://my.oschina.net/u/3112136/blog/800713) 2. ...