CodeForces 788B - Weird journey [ 分类讨论 ] [ 欧拉通路 ]
2024-08-24 06:48:39
题意:
给出无向图.
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);
}
最新文章
- jQuery动画效果animate和scrollTop结合使用实例
- Javascript模块化编程(三):require.js的用法(转)
- JDBC进行批处理
- unison+inotify实现文件双向自动同步
- 事务回滚后,自增ID仍然增加
- mvp(2)一个简单示例,加深理解
- linux下系统启动时,几个配置文件 /etc/profile、~/.bash_profile 等几个文件的执行过程,先后顺序
- BLOB或TEXT字段使用散列值和前缀索引优化提高查询速度
- 条件与(&;&;)和逻辑与(&;)以及条件或(||)和逻辑或(|)区别
- libctemplate——C语言模块引擎简介及使用
- Extjs中grid表头内容居中
- bzoj2346[Baltic 2011]Lamp
- iOS中 超简单抽屉效果(MMDrawerController)的实现
- 学习安卓开发[5] - HTTP、后台任务以及与UI线程的交互
- 19.java反射入门
- 在macOS下使用MAXPP搭建本地开发服务器简易流程
- libgdx学习记录17——照相机Camera
- Vue入门---属性、style和class绑定方法
- Python面向对象(类的成员之属性)
- docker的简单使用----适用于新手