题目链接:

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] 旅游 解题报告 (欧拉回路+最小生成树)的更多相关文章

  1. [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)

    题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才.        ...

  2. [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)

    题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...

  3. [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...

  4. [JZOJ 5906] [NOIP2018模拟10.15] 传送门 解题报告(树形DP)

    题目链接: https://jzoj.net/senior/#contest/show/2528/2 题目: 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传 ...

  5. [JZOJ 5894] [NOIP2018模拟10.5] 同余方程 解题报告(容斥)

    题目链接: http://172.16.0.132/senior/#contest/show/2523/0 题目: 题解:(部分内容来自https://blog.csdn.net/gmh77/arti ...

  6. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...

  7. [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)

    题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...

  8. [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...

  9. [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)

    题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景:尊者神高达很穷,所以他需要跑商来赚钱题目描述:基三的地图可以看做 n 个城市,m ...

随机推荐

  1. Pycharm使用入门

    Python安装与Pycharm使用入门 一.安装Python 1.Linux下安装 一般系统默认已安装2.6.6版本,升级成2.7版本, 但 2.6 不能删除,因为系统对它有依赖,epel源里最新的 ...

  2. 37.Qt网络与通信

    1 获取本机网络与通信 在网络应用中,经常需要获得本机的主机名.IP地址和硬件地址等网络信息.运用QHostInfo,QNetWorkInterface,QNetworkAddressEntry可获得 ...

  3. ITWorld:2014年全球最杰出的14位编程天才

    近日,ITWorld 整理全球最杰出的 14 位程序员,一起来看下让我们膜拜的这些大神都有哪些?(排名不分先后) 1.Jon Skeet 个人名望:程序技术问答网站 Stack Overflow 总排 ...

  4. Ubuntu16.04系统安装搜狗输入法

    前言:正常双击.deb软件包安装搜狗输入法会有bug,需要按照下面操作进行消除错误. 一.下载搜狗输入法Linux版软件包 下载地址为:http://pinyin.sogou.com/linux/ , ...

  5. SQL*PLUS命令的使用大全

    Oracle的sql*plus是与oracle进行交互的客户端工具.在sql*plus中,可以运行sql*plus命令与sql*plus语句. 我们通常所说的DML.DDL.DCL语句都是sql*pl ...

  6. git工具的安装和使用

    啰嗦几句: 世界上本没有后悔药,但软件开发提供了后悔药,那就是代码管理工具.它可以让你的代码穿越回以前的状态,甚至可以指定某一个时刻,而且还可以穿越回来. 当下流行的代码管理工具有 SVN 和 GIT ...

  7. Centos7 minimal 系列之Redis集群搭建(六)

    一.redis安装 借鉴上篇博客:http://www.cnblogs.com/WJ--NET/p/8176071.html 二.集群搭建 2.1.创建文件夹 mkdir redis_cluster ...

  8. JS中浮点数相加问题

    https://blog.csdn.net/u012937029/article/details/61191512 采用IEEE 754 Floating-point的浮点数编码方式来表示浮点数 按I ...

  9. win7系统桌面上图标都变成lnk后缀

    1.右键点击空白处,选择“新建”,点击“文本文档”: 2.将文档命名为“1”,后缀名改为inf: 3.双击打开,复制以下内容: [Version] Signature="$Chicago$& ...

  10. javascript: 基于原型的面向对象编程

    Douglas Crockford指出javascript是世界上最被误解的编程语言.由于javascript缺少常见的面向对象概念,许多程序猿认为javascript不是一个合适的语言.我在做第一个 ...