P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】
正题
题目链接:https://www.luogu.com.cn/problem/P6628
题目大意
给出\(n\)个点的一张完全无向图,\(i\sim j\)的边权是\(|i-j|\)。
然后给出\(m\)条必经边,和起点\(s\)。
求对于每个终点经过所有必经边的最短路径。
\(1\leq n\leq 2500,0\leq m\leq \frac{n(n-1)}{2}\)
解题思路
很经典的模型,首先起点和终点连一条边,然后考虑加最少的边使得有欧拉回路。
欧拉回路有两个条件,度数都是偶数很好满足,直接把相邻的奇点连边肯定最优,但是还需要满足连通的条件。
考虑到图上边权的特殊性,我们显然只需要使用形如\(i\sim i+1\)的边,而这些边没有必要替代之前新加的边。所以直接拿这些边跑剩下连通块的最小生成树就好了。
时间复杂度\(O(m+n^2\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2510;
struct edge{
int x,y,w;
}e[N];
int n,m,s,cnt,ans,k,B[N*N];
int deg[N],fa[N],pf[N],b[N<<1];
int find(int x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void unionn(int x,int y){
x=find(x);y=find(y);
if(x!=y)fa[x]=y;
return;
}
bool cmp(edge x,edge y)
{return x.w<y.w;}
int main()
{
scanf("%d%d%d",&n,&m,&s);
int sum=0;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
unionn(x,y);deg[x]++;deg[y]++;
B[++cnt]=x;B[++cnt]=y;sum+=abs(x-y);
}
B[++cnt]=s;sort(B+1,B+1+cnt);
cnt=unique(B+1,B+1+cnt)-B-1;
for(int i=1;i<=n;i++)pf[i]=find(i);
deg[s]++;m=0;
for(int t=1;t<=n;t++){
deg[t]++;ans=sum;int last=0;
for(int i=1;i<=cnt;i++)b[i]=B[i];
k=cnt;b[++k]=t;
sort(b+1,b+1+k);
k=unique(b+1,b+1+k)-b-1;
for(int i=1;i<=n;i++)fa[i]=pf[i];
for(int i=1;i<=n;i++)
if(deg[i]&1){
if(last){
for(int j=last;j<i;j++)unionn(i,j);
ans+=i-last;last=0;
}
else last=i;
}
for(int i=1;i<k;i++)
e[i]=(edge){b[i],b[i+1],b[i+1]-b[i]};
sort(e+1,e+k,cmp);
for(int i=1;i<k;i++){
int x=find(e[i].x),y=find(e[i].y);
if(x==y)continue;
fa[x]=y;ans+=e[i].w*2;
}
printf("%d ",ans);deg[t]--;
}
return 0;
}
P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】的更多相关文章
- [省选联考 2020 A 卷] 组合数问题
题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...
- luoguP6623 [省选联考 2020 A 卷] 树(trie树)
luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...
- luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)
luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...
- luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)
luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...
- 洛谷P6623——[省选联考 2020 A 卷] 树
传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...
- 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)
题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...
- [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂
题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...
- 题解 P6622 [省选联考 2020 A/B 卷] 信号传递
洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...
- luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)
luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...
随机推荐
- AECC2018同时中英文切换多开使用,加倍提高你的工作效率
最近相信不少人已经更新了AECC2018,升级之后第一件重要的事当然是中英文的切换了,要不然工作中很麻烦.对于一直习惯用中文的人来说,在用模板过程中会出现各种表达式报错极其不方便,而对于习惯英文操作朋 ...
- Semaphore 类 的使用理解C#
示例 下面的代码示例创建一个信号量,其最大计数为3,初始计数为零. 该示例启动五个线程,这会阻止等待信号量. 主线程使用 Release(Int32) 方法重载将信号量计数增加到其最大值,从而允许三个 ...
- css - 行高
css - 行高 line-height行高 取值:px | em | rem | 百分比 | 纯数字 | normal | inherit 设置给:块.行内.行内块 应用给:文本 继承:块.行内.被 ...
- JS方式实现隐藏手机号码中间4位数
1.截取 function test (value) { const start = value.slice(0, 3) const end = value.slice(-4) return `${s ...
- php检测数组长度的函数sizeof count
php教程检测数组长度的函数sizeof count在php检测数组长度的函数有sizeof count 下面看个简单实例*/$colorlist = array("apple" ...
- 前端axios请求二进制数据流转换生成PDF文件空白问题(终极解决方案)
本文章共1570字,预计阅读时间1 - 3分钟. 问题场景: axios请求二进制数据转换生成PDF空白问题,使用axios请求后端接口,后端返回的二进制流文件,需要转换成PDF,但是在postman ...
- WebService学习总结(四)--基于CXF的服务端开发
本节将实践目前最流行的第二种web service 发布和调试框架 CXF Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩 ...
- 20210716 noip17
考场 终于有一场在晚上考了 T1 随便画了画就发现要求每个点的后继个数,想起来有 dfs 和 toposort 两种方法,感觉很稳 T2 裸的网络流有 70pts?!真香 一看 T3 就想起了 Mst ...
- Python习题集(九)
每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 已知一个数列:1. ...
- jvm学习笔记:虚拟机栈
虚拟机栈 Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same ...