点此看题面

大致题意: 有一个\(n\)行\(m\)列的网格图,让你给每一条边设置一个通过次数(\(\ge1\)),使其成为欧拉回路,且通过次数总和最小。

初始化

首先,由于通过次数\(\ge1\),因此首先必然设置每条边通过次数为\(1\)。

对于一个\(n\)行\(m\)列的网格图,共有\(n(m-1)+m(n-1)\)条边,如下图:

所以,初始化\(ans\)为\(n(m-1)+m(n-1)\)。

仔细观察上图,可以发现,中间的点以及四个角落的点都为偶点,因此只需给边上的点连边,使其全为偶点即可。

但又需要分类讨论。

当\(n,m\)都为偶数时

如图所示:

考虑将两条邻边作为一组。

则我们可以将同一组中两条边的交点向旁边两点连边,这样交点仍为偶点,而交点旁边这两个点也变成了偶点。

这样每条边上剩下的奇点个数就为偶数了。

则我们依然对相邻的两点之间连一条边,这样就可以使所有点都变成偶点了。

加的边数为:

\[2(\frac{n-2}2+\frac{m-2}2)=n+m-4
\]

当\(n,m\)都为奇数时

如图所示:

考虑将两条邻边作为一组。

则我们可以将同一组中两条边的交点向旁边两点连边,这样交点仍为偶点,而交点旁边这两个点也变成了偶点。

这样每条边上剩下的奇点个数就为偶数了。

则我们依然对相邻的两点之间连一条边,这样就可以使所有点都变成偶点了。

加的边数为:

\[2(\frac{n-3}2+\frac{m-3}2)+4=n+m-2
\]

当\(n,m\)一奇一偶时

如图所示(假设\(n\)为奇数,\(m\)为偶数):

我们把两条奇数边靠同一边的一个点一起向角上的点连边,然后剩下的\(n-3\)个点在相邻的两点之间连一条边。

其中被连过边的角上两点变成奇点,因此需向这条偶数边上两侧的点连一条边。此时这条边上剩下的\(m-4\)个点再在相邻的两点之间连一条边。

然后可以发现还有一条边上始终没有连过边,则直接在相邻的两点之间连一条边即可。

加的边数为:

\[2*\frac{n-3}2+\frac{m-4}2+\frac{m-2}2+4=n+m-2
\]

不难发现\(m\)为奇数,\(n\)为偶数时同理。

当\(n=2\)或\(m=2\)时

上面的分类讨论看似包含了所有情况,实则还有一种特殊情况没有考虑,即\(n=2\)或\(m=2\)时。

如图所示:

不难发现,\(n\)或\(m\)若有一个为\(2\),则另一边的点可以与对边上的点两两相连。

加的边数为:

\[n-2\ or\ m-2
\]

总结

因此,对于给定的\(n\)和\(m\),先初始化\(ans\)为\(n(m-1)+m(n-1)\)。

接下来,特判\(n=2\)或\(m=2\)的情况。

然后分奇偶性讨论,从上面的分析可以发现,在有至少一个奇数时加边数为\(n+m-2\),若皆为偶数则加边数可以减\(2\)。

具体实现见代码。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
using namespace std;
int n,m;
int main()
{
scanf("%d%d",&n,&m);RI ans=n*(m-1)+m*(n-1);//读入+初始化ans
if(n==2) return printf("%d",ans+m-2),0;if(m==2) return printf("%d",ans+n-2),0;//特判n=2或m=2的情况
return ans+=n+m-2,!(n&1)&&!(m&1)&&(ans-=2),printf("%d",ans),0;//考虑一般情况,分奇偶性讨论
}

【CCPC-Wannafly Winter Camp Day4 (Div1) D】欧拉回路(分类讨论)的更多相关文章

  1. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  2. Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  Portal  原题目描述在最下面.  简单的 ...

  3. CCPC-Wannafly Winter Camp Day4 Div1 - 咆咆咆哮 - [三分+贪心]

    题目链接:https://zhixincode.com/contest/18/problem/I?problem_id=267 题目描述 输入描述 输出描述 一行一个整数表示答案. 样例输入 1 32 ...

  4. CCPC-Wannafly Winter Camp Day4 Div1 - 置置置换 - [DP]

    题目链接:https://zhixincode.com/contest/18/problem/G?problem_id=265 题目描述 wls有一个整数 $n$,他想请你算一下有多少 $1...n$ ...

  5. CCPC-Wannafly Winter Camp Day4 Div1 - 最小边覆盖 - [线段树]

    题目链接:https://zhixincode.com/contest/18/problem/C?problem_id=261 样例输入 1 4 21 23 4 样例输出 1 Yes 样例输入 2 4 ...

  6. CCPC-Wannafly Winter Camp Day4 Div1 - 夺宝奇兵 - [简单思维题]

    题目链接:https://zhixincode.com/contest/18/problem/A?problem_id=259 题目描述 wls正在玩一个寻宝游戏. 宝藏一共有 $n$ 种,都藏在一个 ...

  7. 【CCPC-Wannafly Winter Camp Day4 (Div1) G】置置置换(动态规划)

    点此看题面 大致题意: 求出有多少个长度为\(n\)的排列满足对于奇数位\(a_{i-1}<a_i\),对于偶数位\(a_{i-1}>a_i\). 考虑打表? 考虑每次只有一个数\(n\) ...

  8. 【CCPC-Wannafly Winter Camp Day4 (Div1) A】夺宝奇兵(水题)

    点此看题面 大致题意: 有\(n\)种宝藏,每种各两个.让你依次获得\(1\sim n\)号宝藏,然后依次获得剩余的\(n\sim1\)号宝藏,求最少步数. 简单结论 其实这题有一个十分简单的结论,即 ...

  9. 【CCPC-Wannafly Winter Camp Day4 (Div1) C】最小边覆盖(简单题)

    点此看题面 大致题意: 给你一个边集的子集,问你这可不可能是这张图的最小边覆盖. 大致思路 考虑到,如果一条边连接的两个点度数都大于等于\(2\),则这条边完全可以删去. 因此,我们只要判断是否存在这 ...

随机推荐

  1. python解决excel工作薄合并处理(openpyxl处理excel2010以上版本)

    前段时间使用xlrd.xlwt对文件进行处理(https://www.cnblogs.com/pinpin/p/10287491.html),但是只能处理excel2010以下版本,所以又写了个处理e ...

  2. 锁、CAS操作和无锁队列的实现

    https://blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运: ...

  3. php数组·的方法-数组与数据结构

    /*数组与数据结构*/ //shuffle() 随机打乱数组 //array_push() 数组末尾添加元素 //array_pop() 数组末尾删除元素 //array_shift() 数组首位删除 ...

  4. 剑指offer中经典的算法题之从头到尾打印链表

    话不多说上代码: 我自己的算法是: /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int ...

  5. Python + Selenium 基础篇 - 打开和关闭浏览器

    1.首先要下载浏览器对应的driver,并放到你的python安装目录 Chrome浏览器(chromedriver): http://npm.taobao.org/mirrors/chromedri ...

  6. JEECMS站群管理系统-- Jeecms安装过程

    Jeecms是基于java技术研发的站群管理系统,稳定.安全.高效.跨平台.无限扩展是jeecms 的优点,系统支持mysql.oracle.sqlserver.db2等主流数据库. 轻松建设大规模网 ...

  7. Quartz使用(1) - 初识quartz

    1. 背景 由于最新的工作项目中,需要使用quartz框架,以完成相关的任务的定时执行.经过两周的调研与使用,本系列博客会参考官网及网上相关博客,结合工作项目中的使用,详细介绍quartz的各个方面. ...

  8. CentOS7安装Nginx实现API网关

    参考 http://nginx.org/ http://nginx.org/en/linux_packages.html#stable https://www.npmjs.com/package/js ...

  9. Ubuntu15.10下安装Docker

    1.首先查看linux系统版本 head -n 1 /etc/issue 2.升级包管理器 sudo apt-get update sudo apt-get install apt-transport ...

  10. 使用dtd--声明实体

    1.预定义实体 符号 实体引用 < < > > & & ' &apos; " " 2.自定义实体 <!ENTITY addre ...