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每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...
随机推荐
- Elastic Search中DSL Query的常见语法
Query DSL是一种通过request body提交搜索参数的请求方式.就是将请求头参数(?xxx=xxx)转换为请求体参数.语法格式:GET [/index_name/type_name]/_s ...
- squoosh
谷歌在线压缩图片
- webmagic学习之路-1:采集安居客列表页测试
---恢复内容开始--- package com.action; import java.util.ArrayList; import java.util.List; import java.util ...
- Code First项目Migrations
关于Enable-Migrations指令说明我们知道,Enable-Migrations的作用是在Code First项目中使用数据迁移,通过get-help Enable-Migrations查看 ...
- WCF寄宿windows服务一
如果只是寄宿单个wcf服务,方法很简单,步骤:1.创建好一个windows服务.关于windows服务内容见:http://www.cnblogs.com/zhaow/p/7866916.html2. ...
- centos7安装nginx服务
Nginx发音引擎x是一个免费的开源高性能HTTP和反向代理服务器,负责处理互联网上一些最大的网站的负载. 本教程将教你如何在你的CentOS Linux 7.5机器上安装和管理Nginx. 安装Ng ...
- centos 配置mysql主从复制
mysql+centos7+主从复制 MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公 ...
- PHP获取某段文字作为标题
<?php mb_internal_encoding('utf-8'); // 提取文字标题,多余文字用省略号替换 $arr=[ '用心用情用功,进行无愧于时代的文艺创造', '一图了解第二届一 ...
- vue中keep-alive路由缓存
<keep-alive> <component v-bind:is="view"></component> </keep-alive> ...
- 使用webpack + momentjs时, 需要注意的问题
注意开发HTML页面charset, 如是不是utf-8, 比如是shift_jis, 一般会在webpack里用插件EncodingPlugin把开发的utf-8格式转码成shift_jis格式 ...