Description

Input

Output

Sample Input

2 1
1 2
1 1 2 2

Sample Output

5
 
思路还是很简单的,然而最短路打错各种对拍各种调了一早上
代码:
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<vector>
  5. #include<queue>
  6. #include<cstdlib>
  7. #include<map>
  8. #include<algorithm>
  9. #define M 300010
  10. using namespace std;
  11. vector<int>S1[M],S2[M];
  12. map<int,int>f[M];
  13. int n,m,num,cnt,x1,x2,y1,y2;
  14. int head[M],dis[M],vis[M],st[M],v[M];
  15. struct point{int to,next,dis;}e[M<<];
  16. void add(int from,int to,int dis) {
  17. e[++num].next=head[from];
  18. e[num].to=to;
  19. e[num].dis=dis;
  20. head[from]=num;
  21. }
  22. void SPFA(int s) {
  23. memset(dis,,sizeof(dis));
  24. queue<int>Q;dis[s]=;
  25. Q.push(s);
  26. while(!Q.empty()) {
  27. int x=Q.front();Q.pop();vis[x]=false;
  28. for(int i=head[x];i;i=e[i].next) {
  29. int to=e[i].to;
  30. if(dis[x]+e[i].dis<dis[to]) {
  31. dis[to]=dis[x]+e[i].dis;
  32. if(!vis[to]) vis[to]=true,Q.push(to);
  33. }
  34. }
  35. }
  36. }
  37. int get(int x,int y) {
  38. return *abs(v[st[x]]-v[st[y]]);
  39. }
  40. bool cmp(int x,int y) {
  41. return v[x]<v[y];
  42. }
  43. int main() {
  44. scanf("%d%d",&n,&m);
  45. for(int i=;i<=m;i++) {
  46. int x,y;scanf("%d%d",&x,&y);
  47. if(f[x][y]!=) continue;
  48. f[x][y]=++cnt;
  49. S1[x].push_back(cnt);v[cnt]=y;
  50. S2[y].push_back(++cnt);v[cnt]=x;
  51. add(cnt-,cnt,),add(cnt,cnt-,);
  52. }
  53. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  54. if(!f[x1][y1]) {
  55. f[x1][y1]=++cnt;
  56. S1[x1].push_back(cnt);v[cnt]=y1;
  57. S2[y1].push_back(++cnt);v[cnt]=x1;
  58. add(cnt-,cnt,),add(cnt,cnt-,);
  59. }
  60. else {
  61. int t=f[x1][y1];
  62. add(t+,t,),add(t,t+,);
  63. }
  64. if(!f[x2][y2]) {
  65. f[x2][y2]=++cnt;
  66. S1[x2].push_back(cnt);v[cnt]=y2;
  67. S2[y2].push_back(++cnt);v[cnt]=x2;
  68. add(cnt-,cnt,),add(cnt,cnt-,);
  69. }
  70. else {
  71. int t=f[x2][y2];
  72. add(t+,t,),add(t,t+,);
  73. }
  74. for(int i=;i<=(n<<);i++) {
  75. int tmp=;
  76. for(int j=;j<S1[i].size();j++) st[++tmp]=S1[i][j];
  77. if(tmp>) {
  78. sort(st+,st+tmp+,cmp);
  79. for(int j=;j<=tmp;j++) {
  80. add(st[j-],st[j],get(j-,j));
  81. add(st[j],st[j-],get(j,j-));
  82. }
  83. }
  84. tmp=;
  85. for(int j=;j<S2[i].size();j++) st[++tmp]=S2[i][j];
  86. if(tmp>) {
  87. sort(st+,st+tmp+,cmp);
  88. for(int j=;j<=tmp;j++) {
  89. add(st[j-],st[j],get(j-,j));
  90. add(st[j],st[j-],get(j,j-));
  91. }
  92. }
  93. }
  94. int s=f[x1][y1],t=f[x2][y2];
  95. SPFA(s);
  96. printf("%d\n",dis[t]>1e8?-:dis[t]);
  97. return ;
  98. }

HINT

N<=20000,M<=100000

[BZOJ2834]回家的路的更多相关文章

  1. 分层图最短路【bzoj2834】: 回家的路

    分层图最短路[bzoj2834]: 回家的路 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2834 这道题难在建边. 自己写的时候想到了 ...

  2. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  3. bzoj 2834: 回家的路

    题目 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  DCOI Logout 捐赠本站 Notice:1 ...

  4. P3831 [SHOI2012]回家的路

    P3831 [SHOI2012]回家的路 分层图基础题,就是建图稍有麻烦   #include<cstdio> #include<algorithm> #include< ...

  5. 【bzoj2834】回家的路 分层图最短路

    题目描述 输入 输出 样例输入 2 1 1 2 1 1 2 2 样例输出 5 题解 分层图最短路 dis[i][0]表示到i为横向时起点到i的最短路,dis[i][1]表示到i为纵向时起点到i的最短路 ...

  6. [SHOI2012]回家的路

    题目背景 SHOI2012 D2T1 题目描述 2046 年 OI 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由2n2n条地铁线路构成,组成了一个nn纵nn横的交通网.如 ...

  7. [SHOI2012]回家的路 最短路

    ---题面--- 题解: 吐槽:找了好久的错,换了n种方法,重构一次代码,,,, 最后发现,,, 数组开小了,其实一开始尝试开大了数组,但唯独没有尝试开大手写队列的数组.... 思路: 有两种方法,这 ...

  8. 洛谷P3831 回家的路

    题目背景 SHOI2012 D2T1 题目描述 \(2046\) 年 \(OI\) 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由\(2n\)条地铁线路构成,组成了一个\( ...

  9. BZOJ.2834.回家的路(最短路Dijkstra 拆点)

    题目链接 对于相邻的.处在同在一行或一列的车站连边,然后用dis[x][0/1](或者拆点)分别表示之前是从横边还是竖边到x的,跑最短路. 我选择拆点.. //13028kb 604ms #inclu ...

随机推荐

  1. bootstrap之表单

    一.表单布局 向父 <form> 元素添加 role="form". 把标签和控件放在一个带有 class .form-group 的 <div> 中.这是 ...

  2. 【BZOJ2142】礼物 组合数+CRT

    [BZOJ2142]礼物 Description 小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi.请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在 ...

  3. 在linux下安装Avria(小红伞)

    1.下载AntiVir PersonalEdition Classic for linux http://www.free-av.com/ 2.解压: tar zxvf antivir.tar.gz ...

  4. Windows Phone 自定义一个启动画面

    1.新建一个UserControl <UserControl x:Class="LoadingPage.PopupSplash" xmlns="http://sch ...

  5. 微信开发(3):微信公众号发现金红包功能开发,利用第三方SDK实现(转)

    最近需求是 用户兑换微信红包,需要一些验证,加密,以及证书: 工欲善其事必先利其器 感谢前辈的微信SDK 已经维护三年了,还在维护中! 官方文档走一波 文档还是一如既往的 坑人啊,写的很简单,对简单明 ...

  6. mysql 修改配置文件性能优化

    vim /etc/my.cnf 原配置文件 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # ...

  7. 删除Excel中的复选框等控件

  8. Oracle Schema Objects——View

    Oracle Schema Objects Oracle视图View 普通视图.物化视图 视图(视图不包含数据,不是段对象,不占用空间,只是一个代码.) 作用: 简化SQL 为安全,不暴露表的名称 视 ...

  9. Spring - Bean Definition Bean定义 给容易提供元数据的3方法

    Spring Bean Definition https://www.tutorialspoint.com/spring/spring_bean_definition.htm The objects ...

  10. Ultra-QuickSort---poj2299 (归并排序.逆序数.树状数组.离散化)

    题目链接:http://poj.org/problem?id=2299 题意就是求把数组按从小到大的顺序排列,每次只能交换相邻的两个数, 求至少交换了几次 就是求逆序数 #include<std ...