jzoj3086,luogu3831-[SHOI2012]回家的路【最短路,拆点】

正题

luogu评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3831


题目大意

n∗nn*nnn的铁路网走一格代价为2,mmm个中转站可以改变方向代价为1。求两个点之间的最短路。


解题思路

我们发现n∗nn*nnn很大,所以我们考虑根据mmm建图。算上起点和终点为中转站。

对于每个中转站,我们只连接上下左右最近的点,这个排序可以做到。这样边数就不会太多。可是如何解决转向的问题。

对于每个点,拆成横点和纵点,横着的连横点,竖着的连纵点,横点和纵点之间建立一条边,长度为1。

问题完美解决


codecodecode

#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
#define py(aaa) aaa*2-1
#define px(aaa) aaa*2
using namespace std;
const int N=200100,L=20010;
struct node{int to,next,w;
}a[N*5];
vector<int> in_x[L],in_y[L];
queue<int> q;
int ls[N],tot,n,m,f[N],v[N],x[N],y[N];
bool cmp_x(int xs,int ys)
{return y[xs]<y[ys];}
bool cmp_y(int xs,int ys)
{return x[xs]<x[ys];}
void addl(int x,int y,int w)
{a[++tot].to=y;a[tot].w=w;a[tot].next=ls[x];ls[x]=tot;
}
int spfa(int s,int t)
{memset(f,0x3f,sizeof(f));f[py(s)]=f[px(s)]=0;q.push(py(s));q.push(px(s));while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;if(!v[y]){q.push(y);v[y]=true;}}}v[x]=false;}if(f[px(t)]>=1061109567) return -1;return min(f[px(t)],f[py(t)]);
}
int main()
{scanf("%d%d",&n,&m);m+=2;for(int i=1;i<=m;i++){scanf("%d%d",&x[i],&y[i]);in_x[x[i]].push_back(i);in_y[y[i]].push_back(i);addl(px(i),py(i),1);addl(py(i),px(i),1);}for(int i=1;i<=n;i++)sort(in_x[i].begin(),in_x[i].end(),cmp_x);for(int k=1;k<=n;k++)for(int i=0;i+1<in_x[k].size();i++){int as=in_x[k][i],bs=in_x[k][i+1];addl(px(as),px(bs),(y[bs]-y[as])*2);addl(px(bs),px(as),(y[bs]-y[as])*2);}for(int i=1;i<=n;i++)sort(in_y[i].begin(),in_y[i].end(),cmp_y);for(int k=1;k<=n;k++)for(int i=0;i+1<in_y[k].size();i++){int as=in_y[k][i],bs=in_y[k][i+1];addl(py(as),py(bs),(x[bs]-x[as])*2);addl(py(bs),py(as),(x[bs]-x[as])*2);}printf("%d",spfa(m-1,m));
}

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

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

相关文章

活动:北京Xamarin分享会第8期(2017年11月11日)

本期活动内容预告&#xff1a; 分享主题1: Tech Summit 2017大会课程 - 21世纪不动产使用Xamarin和Azure案例。 分享者&#xff1a;周岳, 微软MVP (Xamarin) , 北京视高盛景软件首席架构师 分享主题2: Tech Summit 2017大会课程 - AI: 清清爽爽几步&#xff0c;打造专属视觉分…

IDEA创建包不是树形

创建包的时候和别人的不一样&#xff0c;不是树形结构 可以点击图中的齿轮改变选项 把两个对勾取消掉就可以了 现在就是树形结构了

.NET Core跨平台的奥秘[下篇]:全新的布局

从本质上讲&#xff0c;按照CLI规范设计的.NET从其出生的那一刻就具有跨平台的基因&#xff0c;这与Java别无二致。由于采用了统一的中间语言&#xff0c;微软只需要针对不同的平台设计不同的虚拟机&#xff08;运行时&#xff09;就能弥合不同操作系统与处理器架构之间的差异&…

漫画:什么是拜占庭将军问题

转载自 漫画&#xff1a;什么是拜占庭将军问题 什么是拜占庭将军问题&#xff1f; 在很久很久以前&#xff0c;拜占庭是东罗马帝国的首都。那个时候罗马帝国国土辽阔&#xff0c;为了防御目的&#xff0c;因此每个军队都分隔很远&#xff0c;将军与将军之间只能靠信使传递消息…

欢乐纪中某A and B组赛【2019.1.23】

前言 翻车的更惨 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC2929292017myself2017myself2017myself1601601607070700009090903636362017zyc2017zyc2017zyc1401401407070701010106060605454542017lw2017lw2017lw10010010050505000…

2019年度总结

还有两天就是2020年了&#xff0c;因此写一篇年度总结吧&#xff0c;以后争取每年都会写一篇的。 2019年回顾&#xff1a; 收获 2019年真是神奇的一年&#xff0c;对我而言&#xff0c;这一年收获的东西非常多&#xff0c;是我真正的入门编程的一年。 从二月份入门java到现在…

SQL Server 审计

审计&#xff08;Audit&#xff09;用于追踪和记录SQL Server实例或数据库中发生的事件&#xff0c;审计主要包括审计对象&#xff08;Audit&#xff09;和审计规范&#xff08;Audit Specification&#xff09;&#xff0c;创建审计首先需要创建一个SQL Server 实例级的审计对…

Hadoop入门(十九)Mapreduce的最大值程序

一、简介 最大值是统计中最常使用到的&#xff0c;现在使用Mapreduce在海量数据中统计数据的最大值。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都存储了若干个数值&#xff0c;求所有数值中的最大值。 样例输入&#xff1a; …

jzoj3913-艰难的选择【差分,统计】

正题 题目大意 一个01串&#xff0c;求最长的子串使得0和1都相等。 解题思路 维护差分数组zzz&#xff0c;vixv_ixvi​x表示iii最早出现在差分数组的那个数字。枚举尾部&#xff0c;用viv_ivi​ codecodecode #include<cstdio> #include<algorithm> #include<…

ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理

本博文翻译自&#xff1a; https://dotnetcoretutorials.com/2017/10/16/owasp-top-10-asp-net-core-broken-authentication-session-management/ 在我们之前关于OWASP Top 10的文章中&#xff0c;我们讨论了SQL注入。SQL注入有一个非常明确的解释和例子&#xff0c;但这次我们…

Hadoop入门(二十)Mapreduce的最小值程序

一、简介 最小值是统计中最常使用到的&#xff0c;现在使用Mapreduce在海量数据中统计数据的最小值。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都存储了若干个数值&#xff0c;求所有数值中的最小值。 样例输入&#xff1a; …

jzoj3914-人品问题【树形dp】

正题 题目大意 一棵树每个点有权值&#xff0c;选择kkk个点&#xff0c;要求选子节点之前必须要选父节点。求最大权值。 解题思路 树形背包限制一下必须选kkk个就好了 codecodecode #include<cstdio> #include<algorithm> #include<cstring> #define N 11…

Docker部署运行微服务

1、环境准备&#xff1a; 主机&#xff1a; X-shell X-ftp jar包 这里只说下jar包&#xff0c;另外两个到官网下载即可 Idea打包jar包流程 先按这四步走 先点击左下的框框&#xff0c;再点击maven&#xff0c;出现右边的窗口&#xff0c;点击clean&#xff0c;再点击package&…

Hadoop入门(二十一)Mapreduce的求和程序

一、简介 求和是统计中最常使用到的&#xff0c;现在使用Mapreduce在海量数据中统计数据的求和。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都存储了若干个数值&#xff0c;求所有数值中的求和。 样例输入&#xff1a; …

欢乐纪中某B组赛【2019.1.24】

前言 划水AKAKAK 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017myself2017myself2017myself3003003001001001001001001001001001001112017xjq2017xjq2017xjq3003003001001001001001001001001001009992017zyc2017zyc2017zyc26…

.net ef core 领域设计代码转换(上篇)

一、前言 .net core 2.0正式版已经发布几个月了&#xff0c;经过研究&#xff0c;决定把项目转移过来&#xff0c;新手的话可以先看一些官方介绍 传送门&#xff1a;https://docs.microsoft.com/zh-cn/dotnet/core/ 由于在领域设计模型上遇到了一些坑&#xff0c;故给大家分享出…

NAT是什么?它有什么功能?值不值得我们去学习?我们该如何去学习呢?

NAT是网络地址转换&#xff08;Network Address Translation&#xff09;的缩写&#xff0c;是一种用于将私有网络内部IP地址转换为公共网络IP地址的技术。NAT最初被设计用于解决IPv4地址短缺的问题&#xff0c;但现在也被广泛用于在家庭和企业网络中共享单个公共IP地址。 NAT…

Hadoop入门(二十二)Mapreduce的求平均值程序

一、简介 求平均值是统计中最常使用到的&#xff0c;现在使用Mapreduce在海量数据中统计数据的求平均值。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都存储了若干个数值&#xff0c;求所有数值中的求平均值。 样例输入&#xff1a; …

mysql添加新用户

新建用户 create user ‘kejin’‘localhost’ identified by ‘123456’; 删除用户 DROP USER ‘kejin’‘localhost’; 为所有数据库/表赋予 CREATE 和 INSERT 权限&#xff1a; GRANT CREATE, INSERT ON . TO ‘myuser’‘localhost’; 验证给用户赋予的全权限&#xff…

jzoj1610(初中)-导弹【最大匹配,最短路,二分答案】

正题 题目大意 有KKK个点&#xff0c;NNN个点a∈Aa\in Aa∈A&#xff0c;MMM个点b∈Bb\in Bb∈B。 给x∈Bx\in Bx∈B点集匹配一个y∈Ay\in Ay∈A点集的点&#xff0c;使他之间的最长最短路径最短。 解题思路 FlodyFlodyFlody暴力预处理最短路&#xff0c;然后二分答案midmidmi…