题意:

给出无向图.

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);
}

最新文章

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

热门文章

  1. Linux 防火墙设置常用指令
  2. 【LOJ】#2983. 「WC2019」数树
  3. 结对编程-如何用精简的java代码写出这个系统
  4. 第二周Java课堂作业
  5. Spring4学习回顾之路03—XML配置Bean ,依赖注入的方式
  6. 洛谷 P2018 消息传递 题解
  7. django 模块查询
  8. WebMvcConfigurationSupport跨域和fastjson全局替换
  9. 并不对劲的bzoj4001:loj2105:p3978:[TJOI2015]概率论
  10. MFC六大核心机制