赛前训练3 欧拉路

news/2025/9/21 17:35:48/文章来源:https://www.cnblogs.com/XOF-0-0/p/19103875

以下,斜体表示注意点,粗体表示技巧点。

无向图欧拉路径的判定:

  • 除去孤点之外图联通

  • 度数为奇数的点只有 \(0\)\(2\) 个。

有向图欧拉路径的判定:

  • 除去孤点之外图联通。

  • 出度比入度大一或入度比出度大一的有 \(0\)\(2\) 个。

  • 除了第二条中的点,全都是入度等于出度的点

A

拆边空间大小翻倍

将每条边拆成两条,然后跑有向图欧拉路径即可。

实现
#include<bits/stdc++.h>
#define int long long
using namespace std;const int N=1e4+5;
int n,m,cnt;
int ans[N*10];
vector<int> G[N];void dfs(int cur){for(int &i:G[cur]){if(i){int x=i; i=0;dfs(x);}}ans[++cnt]=cur;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m;for(int i=1,u,v;i<=m;i++){cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}cnt=0,dfs(1);for(int i=cnt;i>=1;i--)cout<<ans[i]<<'\n';return 0;
}

B

判孤点

对于每个连通块,累加其贡献,即连通块中度数为奇数点的个数的一半,孤点和没有奇数点的情况不算。

实现
#include<bits/stdc++.h>
#define int long long
using namespace std;const int N=2e5+5;
int n,m,cnt,siz;
int d[N],dfn[N];
vector<int> G[N];void dfs(int cur){if(d[cur]&1)cnt++;dfn[cur]=1,siz++;for(int i:G[cur])if(!dfn[i])dfs(i);
}
void solve(){for(int i=1;i<=n;i++)G[i].clear(),d[i]=dfn[i]=0;for(int i=1,u,v;i<=m;i++){cin>>u>>v;G[u].push_back(v);G[v].push_back(u); d[u]++,d[v]++;}if(!m){cout<<"0\n";return;}int ans=0;for(int i=1;i<=n;i++){if(!dfn[i]){cnt=siz=0,dfs(i);if(siz>1)ans+=1+(cnt>2?(cnt-2)/2:0);}}cout<<ans<<'\n';
}signed main(){ios::sync_with_stdio(0);cin.tie(0);for(;cin>>n>>m;solve());return 0;
}

C

仍然考虑拆边,于是题目转化为边翻倍之后有多少种方案使得删掉两条边后仍具有欧拉回路。

删掉两条边理论上会增加四个奇数点,但可以删掉共点的边,这一部分贡献是 \(\sum \operatorname{C}^2_{d_i}\)\(d_i\) 为点 \(i\) 的度数)。

注意到这题有自环,于是我们可以选两个不同的自环,贡献为 \(\operatorname{C}^2_{tot}\)\(tot\) 为自环个数);也可以选一个自环和一个普通边,贡献为 \(tot \times (m-tot)\)

实现
#include<bits/stdc++.h>
#define int long long
using namespace std;const int N=2e6+5;
int n,m;
int d[N],fa[N];
bool vis[N];int fnd(int x){return x==fa[x]?x:fa[x]=fnd(fa[x]);
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m;for(int i=1;i<=n;i++)fa[i]=i;int tot=0;for(int i=1,u,v;i<=m;i++){cin>>u>>v;vis[u]=vis[v]=1;if(u==v){tot++;continue;}d[u]++,d[v]++;u=fnd(u),v=fnd(v);if(u!=v)fa[u]=v;}int root=0;for(int i=1;i<=n;i++)if(fa[i]==i&&vis[i])root++;if(root>1){cout<<0;return 0;}int ans=tot*(tot-1)/2+tot*(m-tot);for(int i=1;i<=n;i++)ans+=d[i]*(d[i]-1)/2;cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDFS 纠删码技术(Erasure Coding, EC)详解 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SQL小贴式: 用NOT EXISTS 而不是 NOT IN !!!

SQL小贴式: 用NOT EXISTS 而不是 NOT IN !!! 当使用NOT IN进行过滤时, 比如NOT IN xxx 时, 如果 xxx 中有NULL值时, 就会一行也不返回 !在 SQL 中,NOT IN 子查询遇到 NULL 值时会产生意外行为,主要因为 SQL 使用三值…

CF global round 29 CD

CF global round 29 CDCF global round 29 C 思路: 只要考虑每个 0 的位置怎么更新 考虑从当前 pos[i] 转移到下一个 pos[i+1] 的位置 分三种情况, 中间没有 1, 只要当前位置有一个位置左右两种情况都能转移 中间 1…

go语言复杂的map

go语言复杂的map 漫思

手撕大模型|FlashAttention 原理及代码解析

在当今大模型蓬勃发展的时代,训练效率成为了制约模型发展与应用的关键因素。Transformer 架构中的自注意力机制虽强大,但面临着高计算成本与内存消耗的挑战。FlashAttention 应运而生,作为一种高效的注意力计算方法…

react工程化

推荐 https://umijs.org/本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/19103865

CF700E Cool Slogans 做题记录

CF700E Cool Slogans 做题记录 https://www.luogu.com.cn/problem/CF700E 首先条件可以转化为,\(s_i\) 必须是 \(s_{i-1}\) 的 border,否则 \(s_i\) 可以缩短且不是变劣。 子串是后缀的前缀,所以在后缀上考虑。设 \…

完整教程:在 Ubuntu 上安装和配置 PostgreSQL 实录

完整教程:在 Ubuntu 上安装和配置 PostgreSQL 实录pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

一个MCU与FPGA混合电路上电启动的问题及其解决办法探索[原创www.cnblogs.com/helesheng]

给出了MCU与FPGA混合电路上电启动不正常现象的一种分析和对应的解决方案。最近在做一个同时需要MCU与FPGA的项目,具体说是FPGA作为MCU的FSMC(Flexible Static Memory Controller)接口的一个外设,通过SRAM接口与MCU…

Unity Volume Rendering

Unity Volume Rendering如下内容是对 https://tips.hecomi.com/entry/2018/01/05/192332 进行翻译同时增补得到笔记体积渲染概述 体积渲染是一种在 2D 屏幕上渲染 3D Texture 的技术,其中 3D Texture 来源有:从 CT 扫…

JMX与RMI

JMX与RMIJMX -监控 Jconsole -Djava.rmi.server.hostname= ip-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=XXX-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.aut…

深入解析:线程安全相关的注解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

go语言的结构体和指针

go语言的结构体和指针type Person struct {Name stringAge int }func updateName(p *Person, newName string) {p.Name = newName // 通过指针修改结构体字段 }func main() {p := Person{Name: "Tom", Age:…

通过主机监控发现路径遍历漏洞的实战技巧

本文介绍如何利用简单的Bash脚本监控主机在线状态,通过实时Telegram通知及时发现目标系统上线,并成功挖掘出Jira系统的路径遍历高危漏洞的实战经验。通过主机监控发现路径遍历漏洞 脚本功能概述 我最近编写了一个简单…

Code New Roman 字体的正确下载方式

Code New Roman 字体的上游已经不知所踪,而各大字体网站上流传的版本在 VS Code 里的显示效果也有些问题。(具体来说,字符的上边界会顶到一行的上边界。)但是我在网上冲浪时发现 Nerd Font 里有修复了这个问题的 r…

go语言中的数组类型

go语言中的数组类型var arr1 [3]int // 声明一个长度为3的整型数组 arr2 := [3]int{1, 2, 3} // 声明并初始化 arr3 := [...]string{"a", "b"} // 自动推断长度fmt.Printl…

多态是对于处理不同的变量,但是使用相同或者类似的方式。多态核心分为两种形式:编译时多态(静态多态)和运行时多态(动态多态)C++中多态通常使用虚函数或者指针(引用)实现。

多态是对于处理不同的变量,但是使用相同或者类似的方式。多态核心分为两种形式:编译时多态(静态多态)和运行时多态(动态多态)C++中多态通常使用虚函数或者指针(引用)实现。pre { white-space: pre !important;…

从 C++ 到 Python

从 C++ 到 Python 一、注释 #单行注释多行注释"""多行注释"""二、字符串 Hello, python! #单、双引号都可以,没有区别 #倾向于用单引号三、I/O与变量 #输出 print(Hello, python!) #Py…

在 Unity 中实现 0GC(零垃圾回收)对象池 — 实战指南 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Nipper 3.9.0 for Windows Linux - 网络设备漏洞评估

Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估 Nipper for routers, switches & firewalls | Nipper Network Configuration Audit Tool 请访…