[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 ...
随机推荐
- ROS集成开发环境RoboWare Studio安装教程
前言:很多人说vim是最快的,所以我选择用roboware. ROS 自带的编辑器vim增加插件,效果如下: RoboWare Studio,效果如下: 下面开始安装. 一.安装 去官网 http:/ ...
- [makefile]如何设置不同目录的代码(.c),生成到指定目录下(./debug/.o))
部分代码跟makefile不在同一目录,有没有好的方法来设置依赖关系,我找到三种方法,但感觉都不完美,下面我会把他列出来并加以说明,不知有没有更好的方法,makefile本身也不是很熟,请大家指教: ...
- C语言中文件定位函数总结
C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...
- Grand Central Dispatch-thread pool pattern
Grand Central Dispatch (GCD) is a technology developed by Apple Inc. to optimize application support ...
- Declarative programming-声明式编程-布局约束是一个案例
声明式编程需要底层或运行时环境支持. 声明式语言的关键词确定了执行的关键控制流. 表述编程语言是说明性的东西:而不是具体的执行方案. 通常他的执行由解释器进行. In computer science ...
- Chrome添加Unity本地文档引擎
前提:输入Unity后出来的第一连接 浏览器的设置: 分别填入: UnityDocs unity3d.com/cn file:///Applications/Unity/Documentation/e ...
- Unity 需不需要再建Assets文件夹
不需要,默认所有文件都是在Assets文件夹下创建的,看不到是因为设置了单栏模式,开启双栏模式就能看到了.
- 路飞学城Python-Day42
前端 ...
- luogu p1004
P1004 题意 类似一个比较小的方格(N<=9),有的点是0,有的点有数, A->B的路径经过的点加上该点代表的数,求两次A->B的最大解(最优解) 一个令人恼的问题是两条路径如果 ...
- python安装Redis数据库
where pip cd 切换这个目录 pip install redis import redis r = redis.Redis(host='127.0.0.1', port=6379) user ...