CodeForces 788B - Weird journey [ 分类讨论 ] [ 欧拉通路 ]
题意:
给出无向图.
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 [ 分类讨论 ] [ 欧拉通路 ]的更多相关文章
- CodeForces - 788B Weird journey 欧拉路
题意:给定n个点,m条边,问能否找到多少条符合条件的路径.需要满足的条件:1.经过m-2条边两次,剩下两条边1次 2.任何两条路的终点和起点不能相同. 欧拉路的条件:存在两个或者0个奇度顶点. 思路 ...
- HDU 5883 F - The Best Path 欧拉通路 & 欧拉回路
给定一个图,要求选一个点作为起点,然后经过每条边一次,然后把访问过的点异或起来(访问一次就异或一次),然后求最大值. 首先为什么会有最大值这样的分类?就是因为你开始点选择不同,欧拉回路的结果不同,因为 ...
- ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)
判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...
- POJ 1300 欧拉通路&欧拉回路
系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...
- poj 2513 连接火柴 字典树+欧拉通路 好题
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27134 Accepted: 7186 ...
- poj2513- Colored Sticks 字典树+欧拉通路判断
题目链接:http://poj.org/problem?id=2513 思路很容易想到就是判断欧拉通路 预处理时用字典树将每个单词和数字对应即可 刚开始在并查集处理的时候出错了 代码: #includ ...
- hdu1116有向图判断欧拉通路判断
Play on Words Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash
题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点 或者 ...
- 欧拉回路&欧拉通路判断
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...
随机推荐
- 从入门到自闭之Python--虚拟环境如何安装
Windows下创建虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版 ...
- log4j rootLogger配置示例(log4j.properties)
log4j.rootLogger=INFO,commonLogger, log4j.appender.commonLogger=org.apache.log4j.ConsoleAppenderlog4 ...
- Glide优化
几乎所有的 OOM 错误都是因为宿主应用出了问题,而不是 Glide 本身. 应用里两种常见的 OOM 错误分别是: 过大的内存分配 (Excessively large allocations) 内 ...
- java的Thread Dump诊断工具
1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Jav ...
- asp.net 10 Cookie & Session
Cookie 1.什么是Cookie 一小段文本,明文的数据,关于网站相关的文本字符串数据.一个客户端状态保持机制~ 存储在客户端的浏览器内存里面或者磁盘(如果不指定过期时间,那么存储在客户端浏览器内 ...
- C#面向对象11 里氏转换
里氏转换 1.子类可以赋值给父类. using System; using System.Collections.Generic; using System.Linq; using System.Te ...
- 记 Win10 - Archlinux - Archlinux(Emergency) 三系统安装/配置注意事项
起因是正常使用的archlinux做滚动更新,结果貌似有一个盘块写坏了(?). 手上没有U盘,进入不了linux,不好做fsck.于是直接就直接用win10了. 取消Fast Boot 当晚进入lin ...
- node jade || ejs引擎模板
1.jade:破坏式2.ejs:保留式 -------------------------------------------------------------------------------- ...
- Shell-使用mkfifo实现多任务并发及并发数控制
以下为代码实现的一个模拟场景:3个生产者,在不断提供服务,处理需求,假设1s处理一个. 20个消费者,在不断消耗供给产品,提交需求,假设3s消耗一个. 情景分析:由于消费者的提交需求能力 和 生产者处 ...
- 基于Linux解决登录ssh客户端失败问题—sshd error: could not load host key
当你ssh远程登录时,会发现ssh登录界面刚打开就会闪退,在查看主机日志消息中,就会看到如下错误: 然而问题的根源也就是这三个文件,无法正常加载ssh主机密钥. 而我们只需要将有问题的文件删除,然后重 ...