题目链接:

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. SAM学习笔记

    SAM学习笔记 后缀自动机(模板)NSUBSTR(Caioj1471 || SPOJ 8222) [题意] 给出一个字符串S(S<=250000),令F(x)表示S的所有长度为x的子串中,出现次 ...

  2. sdwebimage缓存图片

    当使用SDWebImage时,如果用相同图片名的图片替换掉了原始缓存的图片,当再次请求的时候,还是使用的缓存图片,图片不会发生改变 原因:图片在NSCache中是以absolute url作为key存 ...

  3. Maven 学习笔记(二)

    前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...

  4. BZOJ 2427 /HAOI 2010 软件安装 tarjan缩点+树形DP

    终于是道中文题了.... 当时考试的时候就考的这道题.... 果断GG. 思路: 因为有可能存在依赖环,所以呢 先要tarjan一遍 来缩点. 随后就进行一遍树形DP就好了.. x表示当前的节点.j表 ...

  5. linux的chmod,chown命令 详解

    指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案 ...

  6. Spark RDD概念学习系列之Pair RDD的分区控制

    不多说,直接上干货! Pair RDD的分区控制 Pair RDD的分区控制 (1) Spark 中所有的键值对RDD 都可以进行分区控制---自定义分区 (2)自定义分区的好处:  1) 避免数据倾 ...

  7. kettle的下载、安装和初步使用(Ubuntu 16.04平台下)(图文详解)

    不多说,直接上干货! 能够看我这篇博客的博友们,想必是已经具备一定基础了. 扩展博客 kettle的下载.安装和初步使用(windows平台下)(图文详解) kettle的下载 žKettle可以在h ...

  8. 微信小程序遇坑笔记

    最近做了一个简单的微信小程序,遇到了一些坑: 1.appid固定,但是appsecret是可以变的,而且没有地方查看,后台以查看就是变更了,所以这个地方在开发的时候需要保存好: 2.打开网页,这个网页 ...

  9. golden gate的DDL配置

    DDL复制的配置 目前只支持oracle和teradata的ddl复制 oracle能复制除了系统对象之外的所有对象 两种配置方法: 基于trigger的DDL:对于生产库有一定影响. 原理: 源库建 ...

  10. GRpc-Proto3语法

        syntax = "proto3"; 文件的第一行指定了你使用的是proto3的语法:如果你不指定,protocol buffer 编译器就会认为你使用的是proto2的语 ...