[JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)
题目链接:
https://jzoj.net/senior/#main/show/5895
题目:

题解:
有一个好像比较显然的性质,就是每条边最多经过两次
那么我们考虑哪些边需要经过两次。我们把需要经过两次的边连一条重边,这样我们最终的答案就是新图中的最优的欧拉回路
换句话说,我们要把原图中的奇数度数的点两两匹配(一张无向图存在欧拉回路并且仅当每个点的度数都为偶数),在它们之间连边,显然这个连的边是它们在原图的最短路。因为边长的特殊定义,最短路一定是在最小生成树上的。
于是我们只需要考虑最小生成树树上哪些边需要重复连。
注意到上面那个每条边最多经过两次的性质,我们称最终匹配的两两奇数点之间的最短路为路径,也就是不存在一条边在两条路径上,因为肯定会有更优的情况,这样好像就证完了。看图理解一下

如果1,3匹配,2,4匹配的话,中间的边就在两条路径上,而我们显然可以更优的选择1,2匹配和3,4匹配
然后继续,我们发现最小生成树上的边是必须连的边并且仅当这条边两侧都有奇数个奇数度数的点,这样的边的边权我们计入路径和
最终答案就是路径和+所有边的边权和
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long ll; const int N=5e5+;
const int mod=;
int n,m,ans;
int h[N],fa[N],deg[N],siz[N],bin[N];
struct E{
int u,v,w;
}e[N];
struct node{
int v,w;
};
vector <node> mp[N];
inline int read(){
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
int find(int x) {if (fa[x]!=x) fa[x]=find(fa[x]);return fa[x];}
void dfs(int x,int pre){
siz[x]=deg[x];
for (int i=;i<mp[x].size();i++){
int y=mp[x][i].v;if (y==pre) continue;
dfs(y,x);siz[x]+=siz[y];
if (siz[y]&) (ans+=bin[mp[x][i].w])%=mod;
}
}
int main(){
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
n=read();m=read();
bin[]=;for (int i=;i<=m;i++) (bin[i]=bin[i-]<<)%=mod;
for (int i=;i<=n;i++) fa[i]=i;
for (int i=;i<=m;i++) e[i].u=read(),e[i].v=read(),e[i].w=i,deg[e[i].u]^=,deg[e[i].v]^=,(ans+=bin[i])%=mod;
for (int i=;i<=m;i++){
int fx=find(e[i].u),fy=find(e[i].v);
if (fx!=fy){
fa[fx]=fy;
mp[e[i].u].push_back((node){e[i].v,e[i].w});mp[e[i].v].push_back((node){e[i].u,e[i].w});
}
}
dfs(,);
printf("%lld\n",ans);
return ;
}
[JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)的更多相关文章
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...
- [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)
题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...
- [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)
题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...
- [JZOJ 5906] [NOIP2018模拟10.15] 传送门 解题报告(树形DP)
题目链接: https://jzoj.net/senior/#contest/show/2528/2 题目: 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传 ...
- [JZOJ 5894] [NOIP2018模拟10.5] 同余方程 解题报告(容斥)
题目链接: http://172.16.0.132/senior/#contest/show/2523/0 题目: 题解:(部分内容来自https://blog.csdn.net/gmh77/arti ...
- [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)
题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...
- [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)
题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...
- [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)
题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...
- [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)
题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景:尊者神高达很穷,所以他需要跑商来赚钱题目描述:基三的地图可以看做 n 个城市,m ...
随机推荐
- jquery 弹窗插件 layer
jquery 弹窗插件 layer 官网:http://sentsin.com/jquery/layer/ 1 <!DOCTYPE html PUBLIC "-//W3C//DTD H ...
- Jmeter执行多条Mysql语句报错
花了很长时间找原因,Jmeter一直返回的是MySql语法错误,就写了两条很简单的删除语句,并且在MySql里可以正常执行 包括换了jdbc驱动包,更改不同的Query Type等 后来发现两条语句拆 ...
- 编译安装FFmpeg 要支持xvid、x264、mp3、ogg、amr、faac
编译安装FFmpeg 要支持xvid.x264.mp3.ogg.amr.faac libfaac faac格式的编解码包libmp3lame mp3格式编解码包libopencore-am ...
- KCP kcptun
简介 KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果.纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者 ...
- LVS(Linux Viretual Server) 负载均衡器 + 后端服务器
##定义: LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. ##结构: 一般来说,LVS集群采用三层结构,其主要组成部分为: A.负载调 ...
- 高德SDK获取到的坐标转换为GPS真实坐标方法,Java版
发现高德SDK不提供高德的坐标转GPS坐标(GCJ_02转WGS_84),下面是一份Java版的 /**************************** 文件名:GCJ2WGS.java 创建时间 ...
- null和undifned的区别
null和undifned的区别 1 从类型方面:null的类型是对象,undified的类型是undified. 2 从定义方面:null是一个表示"无"的对象,转为数值时为0: ...
- PHP学习过程中遇到的疑难杂症
变量当双引号中包含变量时,变量会与双引号中的内容连接在一起:当单引号中包含变量时,变量会被当做字符串输出. Heredoc结构形式首先使用定界符表示字符串(<<<),接着在“< ...
- 路飞学城Python-Day23(practise)
本章总结 练习题 什么是C/S架构? 互联网协议是什么?分别介绍五层协议中每一层的功能? 基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手 为何基于tcp协议的通信比基于udp协 ...
- Python基础数据类型list,tuple
列表是有序的可变的元素集合.列表中的每个元素可以使任何数据类型,包括列表本身. 列表生成 Python3中的列表通过定义,for循环,列表推导式等几种方式生成 定义 直接通过中括号`[]`定义一个列表 ...