P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】

正题

题目链接:https://www.luogu.com.cn/problem/P6628


题目大意

给出nnn个点的一张完全无向图,i∼ji\sim jij的边权是∣i−j∣|i-j|ij

然后给出mmm条必经边,和起点sss

求对于每个终点经过所有必经边的最短路径。

1≤n≤2500,0≤m≤n(n−1)21\leq n\leq 2500,0\leq m\leq \frac{n(n-1)}{2}1n2500,0m2n(n1)


解题思路

很经典的模型,首先起点和终点连一条边,然后考虑加最少的边使得有欧拉回路。

欧拉回路有两个条件,度数都是偶数很好满足,直接把相邻的奇点连边肯定最优,但是还需要满足连通的条件。

考虑到图上边权的特殊性,我们显然只需要使用形如i∼i+1i\sim i+1ii+1的边,而这些边没有必要替代之前新加的边。所以直接拿这些边跑剩下连通块的最小生成树就好了。

时间复杂度O(m+n2log⁡n)O(m+n^2\log n)O(m+n2logn)


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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 实战:使用ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

一、前言这几年前端的发展速度就像坐上了火箭&#xff0c;各种的框架一个接一个的出现&#xff0c;需要学习的东西越来越多&#xff0c;分工也越来越细&#xff0c;作为一个 .NET Web 程序猿&#xff0c;多了解了解行业的发展&#xff0c;让自己扩展出新的技能树&#xff0c;对…

【CF1199 D,E, F】Welfare State // Matching vs Independent Set // Rectangle Painting 1

2019-08-15下午三道练习题CF1199 思路有点难想 but很好实现 这是原网站链接&#xff1a;传送门 这里只完成D, E, F三题 文章目录D&#xff1a;Welfare State题目大意正解瞅瞅代码E:Matching vs Independent Set题目大意正解代码实现F:Rectangle Painting 1题目大意正解代码实现…

YBTOJ:前缀匹配(AC自动机)

文章目录题目描述解析代码题目描述 解析 做的不错 把trie树真的当成一棵树递归即可 注意一个标记时的问题&#xff1a; void AC(){int lstrlen(s01),pl1;for(int i1;i<l;i){int aask(s0[i]);pltr[pl][a];int kpl;while(k>1){if(ok[k]) break;//注意&#xff01;ok[k]1;…

[HAOI2006]均分数据

[HAOI2006]均分数据 题解&#xff1a; 题目稍微解释一下&#xff1a; 把n个数以分为m组&#xff0c;计算每一组的和&#xff0c;求得到的这m个数的方差。由于分法是任意的&#xff0c;我们要求这些方差中的最小值 我们先用STL中的函数random_shuffle()用来对一个元素序列进行…

开机指南

有些博客上了密码&#xff0c;密码是一个 \(100\) 以内的数字(与ACwisher有关) 腾讯QQ PC版 Notepad Div-c 编译选项&#xff1a; -Wl,--stack1024000000 -Wall -lm -O2 -stdc14 // Author:A weak man named EricQian #include<bits/stdc.h> using namespace std; #defin…

Docker最全教程——从理论到实战(八)

在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯的为讲解知识点而进行讲解。也就是说&#xff0c;笔者希望能够让大家将理论、知识、思想和指导应用到工作的实际场景和实践之中…

CF5E-Bindian Signalizing【单调栈】

正题 题目链接:https://www.luogu.com.cn/problem/CF5E 题目大意 圆上有nnn个山&#xff0c;两个山之间可以看到当且仅当它们之间的两条弧中有一条满足所有山都不高于它们两个。 求可以看到的山的对数。 3≤n≤106,1≤hi≤1093\leq n\leq 10^6,1\leq h_i\leq 10^93≤n≤106,…

不定方程(质数与因数)

文章目录题目描述解析代码题目描述 数据范围有误&#xff01;应该是不超过1e6 解析 容易推出&#xff1a; y&#xff08;x∗*∗n!)/(x-n!) 换元&#xff0c;令tx-n&#xff01; 则&#xff1a; yn!(n!)2/t 因为x、y都与t一一对应 所以本题就是求 (n!)2 的因数个数 我们求出n&…

Matlab快速入门

命令行窗口 clc 清屏 clear 清理变量 常用矩阵&#xff1a; x[0:2] 这是转置符号xlinspace(0,2,5) 从0到2分配5个空间xzeros(2,3)两行三列全为0的矩阵、 ones(2)2行2列全为1的方阵 eye(2)单位阵 rand(1,2)产生一行二列的随机数&#xff08;从0到1之间均匀随机数&#xff09;固…

【CF 1191】Tokitsukaze, CSL and Stone Game//Tokitsukaze and Duel//Tokitsukaze and Strange Rectangle

很难想 but很好实现 博弈论专练 传送门 惯例这里只完成D&#xff0c;E&#xff0c;F 话不多说上代码 文章目录D:Tokitsukaze, CSL and Stone Game题目大意题解代码实现E&#xff1a;Tokitsukaze and Duel题目大意题解代码实现E:Tokitsukaze and Strange Rectangle题目大意题解代…

主席树 - 可持久化线段树

模板 P3834 【模板】可持久化线段树 2(主席树) 区间求第 \(k\) 大 模板代码 #include<bits/stdc.h> using namespace std; #define Maxn 200005 typedef long long ll; inline int rd() {int x0;char ch,t0;while(!isdigit(ch getchar())) t|ch-;while(isdigit(ch)) xx*…

【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式

上篇文章介绍了基于Ids4客户端授权的原理及如何实现自定义的客户端授权&#xff0c;并配合网关实现了统一的授权异常返回值和权限配置等相关功能&#xff0c;本篇将介绍密码授权模式&#xff0c;从使用场景、源码剖析到具体实现详细讲解密码授权模式的相关应用。.netcore项目实…

CF11D-A Simple Task【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF11D 题目大意 给出nnn个点mmm条边的一张简单无向图&#xff0c;求它的简单环的个数。 1≤n≤191\leq n\leq 191≤n≤19 解题思路 首先算重的问题很麻烦但也是解决这题的关键。 因为防止算重那么我们就只考虑在每个环编号…

YBTOJ:灯光控制(贪心)(公倍数)(暴力枚举)

文章目录题目描述解析代码题目描述 解析 没有想出来 首先可以确定开关要么开一次&#xff0c;要么不动&#xff0c;其他都和这俩是等价的 一开始最先想到的就是贪心的方法&#xff0c;每个开关遍历&#xff0c;如果按下会使答案变好就按下。 但是显然当前的开闭对后面是有后效…

Tree Constructer

题目&#xff1a; 题意&#xff1a; 如果点x和y有连边&#xff0c;当且仅当a[x] or a[y] 260 - 1 &#xff08;两者是充分必要&#xff09; 现在给你边的关系&#xff0c;问你每个点的值应该是多少&#xff1f;&#xff08;给出一种情况即可&#xff09; 题解&#xff1a; …

[USACO19JAN,Platinum]Train Tracking 2

虽然是简单的dp &#xff0c;but真的太难想到了&#xff0c;而且我的码力。。。 Train Tracking 2 【题目描述】 每天特快列车都会经过农场。列车有N节车厢&#xff08;1≤N≤105&#xff09;&#xff0c;每节车厢上有一个1到109之间的正整数编号&#xff1b;不同的车厢可能会…

轻重链剖分

重链剖分 P3384 【模板】轻重链剖分/树链剖分 $ / $ 模板代码&#xff1a; 注意&#xff1a; 如果有 \(0\) 号节点&#xff0c;并默认重儿子是零号节点&#xff0c;复杂度会退化为 \(O(n^2)\) 。原因&#xff1a; 代码第一次遍历默认重儿子是0&#xff0c;所以无法保证每次找到…

CF19E-Fairy【树形结构,差分】

正题 题目链接:https://www.luogu.com.cn/problem/CF19E 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;求有多少条边去掉后可以使得图变成一张二分图。 1≤n,m≤1041\leq n,m\leq 10^41≤n,m≤104 解题思路 虽然线段树分治可以暴力草过去但是考虑点智慧的做法。 众…

.netcore 堆栈调用方法小记

1|0背景上午临近午饭时&#xff0c;公司同事反馈验证码被攻击灌水。我们匆忙查询验证码明细&#xff0c;对已频繁出现的IP插入黑名单&#xff0c;但IP仍然隔断时间频繁变动&#xff0c;不得已之下只能先封禁对应公司id的验证码发送功能。年初时候&#xff0c;专门对SSO站点的发…

洛谷P2480:古代猪文(中国剩余定理)(欧拉定理)

传送门 文章目录题目描述解析总结代码题目描述 解析 简单来说&#xff0c;就是求&#xff1a; g∑C(d,n)(d是n的约数&#xff09;mod 999911659 可以先特判一下&#xff0c;999911659|g时&#xff0c;答案为0 否则&#xff0c;可以通过欧拉定理转化为&#xff1a; g∑C(d,n)(d…