题意:

给出无向图.

good way : 仅有两条边只经过一次,余下边全经过两次的路

问你共有多少条不同的good way。

两条good way不同仅当它们所经过的边的集合中至少有一条不同 (很关键)

存在多个边连通分量的情况肯定是0.

当确定某两条边只经过一次的时候:

由于经过边的顺序不重要,余下边全经过两次,至多只有一条good way

那么把剩下经过两次的边拆分成两条经过一次的边,记现在的图是新图

原图中是否存在good way 就等价于新图中是否存在欧拉路

暴力枚举两条边判断肯定是要TLE的

那就要考虑怎样的两条边存在解

先不考虑自环:

当这两条边不相邻时:

由于只有这两条边的端点的度是奇数,其他点都是偶数,新图中共有四个点是奇数度,不存在欧拉路

当这两条边相邻时:

这两条边的三个端点中两个是奇数,余下都是偶数,存在欧拉回路

考虑自环

当其中有一条边是自环时:

自环只有一个端点,故自环的端点是偶数度,新图中只有两个奇数度点,存在欧拉回路

当两条边都是自环时:

所有点都是偶数度,存在欧拉回路

故存在解的情况:

两条边相邻 (去掉自环后的边):

枚举每个端点i, ans += Comb(edge[i].size(), 2);

其中一条边是自环:

ans += loopCnt * (m-1);

ans -= Comb(loopCnt, 2);//重复计算

 #include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN = ;
int n, m;
vector<int> G[MAXN];
int loop[MAXN], lcnt;
int vis[MAXN];
void dfs(int x)
{
if (vis[x]) return;
vis[x] = ;
for (int i = ; i < G[x].size(); i++)
dfs(G[x][i]);
}
int main()
{
for (int i = ; i <= n; i++)
G[i].clear(), vis[i] = loop[i] = ;
lcnt = ;
scanf("%d%d", &n, &m);
int root;
for (int i = ; i <= m; i++)
{
int x, y; scanf("%d%d", &x, &y);
if (x == y) loop[x]++ ,lcnt++;
else
{
G[x].push_back(y);
G[y].push_back(x);
}
root = x;
}
dfs(root);
bool flag = ;
for (int i = ; i <= n; i++)
{
if (!vis[i] && (G[i].size() || loop[i]))
flag = ;
}
if (!flag)
{
puts(""); return ;
}
LL ans = ;
for (int i = ; i <= n; i++)
{
int sz = G[i].size();
ans += (LL)sz*(sz-) / ;
}
ans += (LL)lcnt * (m-);
ans -= (LL)lcnt * (lcnt-) / ;
printf("%lld\n", ans);
}

CodeForces 788B - Weird journey [ 分类讨论 ] [ 欧拉通路 ]的更多相关文章

  1. CodeForces - 788B Weird journey 欧拉路

    题意:给定n个点,m条边,问能否找到多少条符合条件的路径.需要满足的条件:1.经过m-2条边两次,剩下两条边1次  2.任何两条路的终点和起点不能相同. 欧拉路的条件:存在两个或者0个奇度顶点. 思路 ...

  2. HDU 5883 F - The Best Path 欧拉通路 & 欧拉回路

    给定一个图,要求选一个点作为起点,然后经过每条边一次,然后把访问过的点异或起来(访问一次就异或一次),然后求最大值. 首先为什么会有最大值这样的分类?就是因为你开始点选择不同,欧拉回路的结果不同,因为 ...

  3. ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)

    判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...

  4. POJ 1300 欧拉通路&欧拉回路

    系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...

  5. poj 2513 连接火柴 字典树+欧拉通路 好题

    Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27134   Accepted: 7186 ...

  6. poj2513- Colored Sticks 字典树+欧拉通路判断

    题目链接:http://poj.org/problem?id=2513 思路很容易想到就是判断欧拉通路 预处理时用字典树将每个单词和数字对应即可 刚开始在并查集处理的时候出错了 代码: #includ ...

  7. hdu1116有向图判断欧拉通路判断

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  8. Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash

    题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点   或者 ...

  9. 欧拉回路&欧拉通路判断

    欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...

随机推荐

  1. Elastic Search中DSL Query的常见语法

    Query DSL是一种通过request body提交搜索参数的请求方式.就是将请求头参数(?xxx=xxx)转换为请求体参数.语法格式:GET [/index_name/type_name]/_s ...

  2. squoosh

    谷歌在线压缩图片

  3. webmagic学习之路-1:采集安居客列表页测试

    ---恢复内容开始--- package com.action; import java.util.ArrayList; import java.util.List; import java.util ...

  4. Code First项目Migrations

    关于Enable-Migrations指令说明我们知道,Enable-Migrations的作用是在Code First项目中使用数据迁移,通过get-help Enable-Migrations查看 ...

  5. WCF寄宿windows服务一

    如果只是寄宿单个wcf服务,方法很简单,步骤:1.创建好一个windows服务.关于windows服务内容见:http://www.cnblogs.com/zhaow/p/7866916.html2. ...

  6. centos7安装nginx服务

    Nginx发音引擎x是一个免费的开源高性能HTTP和反向代理服务器,负责处理互联网上一些最大的网站的负载. 本教程将教你如何在你的CentOS Linux 7.5机器上安装和管理Nginx. 安装Ng ...

  7. centos 配置mysql主从复制

    mysql+centos7+主从复制   MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公 ...

  8. PHP获取某段文字作为标题

    <?php mb_internal_encoding('utf-8'); // 提取文字标题,多余文字用省略号替换 $arr=[ '用心用情用功,进行无愧于时代的文艺创造', '一图了解第二届一 ...

  9. vue中keep-alive路由缓存

    <keep-alive> <component v-bind:is="view"></component> </keep-alive> ...

  10. 使用webpack + momentjs时, 需要注意的问题

    注意开发HTML页面charset, 如是不是utf-8, 比如是shift_jis,  一般会在webpack里用插件EncodingPlugin把开发的utf-8格式转码成shift_jis格式 ...