按照横,竖为方向跑一个最短路即可,算是水题~

#include <bits/stdc++.h>
#define N 200005
#define E 2000000
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,m,tot,edges,s,T;
int hd[E],to[E],nex[E],val[E],d[E],done[E],id[E][2];
void addedge(int u,int v,int c)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
}
struct Point
{
int x,y,id;
Point(int x=0,int y=0):x(x),y(y){}
}t[N];
struct Node
{
int u,dis;
Node(int u=0,int dis=0): u(u),dis(dis){}
bool operator<(Node b) const
{
return b.dis<dis;
}
};
priority_queue<Node>q;
bool cmpx(Point a,Point b)
{
return a.x==b.x?a.y<b.y:a.x<b.x;
}
bool cmpy(Point a,Point b)
{
return a.y==b.y?a.x<b.x:a.y<b.y;
}
void Dijkstra()
{
memset(d,0x3f,sizeof(d));
for(d[s]=0, q.push(Node(s, 0)); !q.empty(); )
{
Node e = q.top(); q.pop();
int u=e.u;
if(done[u]) continue;
done[u]=1;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(d[v] > d[u] + val[i])
{
d[v] = d[u] + val[i];
q.push(Node(v, d[v]));
}
}
}
}
int main()
{
int i,j,k;
// setIO("input");
scanf("%d%d",&n,&m);
for(i=2;i<=m+1;++i)
{
scanf("%d%d",&t[i].x,&t[i].y);
id[i][0]=++tot;
id[i][1]=++tot;
t[i].id=i;
}
scanf("%d%d",&t[1].x,&t[1].y);
id[1][0]=++tot;
id[1][1]=++tot;
t[1].id=1;
m+=2;
scanf("%d%d",&t[m].x,&t[m].y);
id[m][0]=++tot;
id[m][1]=++tot;
t[m].id=m;
for(i=1;i<=m;++i)
{
addedge(id[i][0],id[i][1],1);
addedge(id[i][1],id[i][0],1);
}
sort(t+1,t+1+m,cmpx);
for(i=1;i<=m;i=j)
{
for(j=i;j<=m&&t[j].x==t[i].x;++j);
for(k=i+1;k<j;++k)
{
addedge(id[t[k-1].id][1], id[t[k].id][1], 2 * (t[k].y-t[k-1].y));
addedge(id[t[k].id][1], id[t[k-1].id][1], 2 * (t[k].y-t[k-1].y));
}
}
sort(t+1,t+1+m,cmpy);
for(i=1;i<=m;i=j)
{
for(j=i;j<=m&&t[j].y==t[i].y;++j);
for(k=i+1;k<j;++k)
{
addedge(id[t[k-1].id][0], id[t[k].id][0], 2 * (t[k].x-t[k-1].x));
addedge(id[t[k].id][0], id[t[k-1].id][0], 2 * (t[k].x-t[k-1].x));
}
} s=0, T=++tot; addedge(s, id[1][0], 0);
addedge(s, id[1][1], 0); addedge(id[m][0], T, 0);
addedge(id[m][1], T, 0);
Dijkstra();
printf("%d\n",d[T]);
return 0;
}

  

BZOJ 2834: 回家的路 Dijkstra的更多相关文章

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

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

  2. bzoj 2834: 回家的路

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

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

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

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

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

  5. P3831 [SHOI2012]回家的路

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

  6. 洛谷P3831 回家的路

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

  7. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路

    2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 647  Solved: 348[Submit][Sta ...

  8. Bzoj 1674: [Usaco2005]Part Acquisition dijkstra,堆

    1674: [Usaco2005]Part Acquisition Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 337  Solved: 162[Sub ...

  9. Bzoj 2346: [Baltic 2011]Lamp dijkstra,堆

    2346: [Baltic 2011]Lamp Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 428  Solved: 179[Submit][Sta ...

随机推荐

  1. 回炉重铸系列之javaEE基础

    这篇文章主要介绍 servlet filter listener interceptor 之 知识点.博文主要从 概念,生命周期,使命介绍其区别.详情如下:   概念 生命周期 使命 servlet ...

  2. PB各对象常用事件

    1.window中的事件 事件名                  触发的时机 01.Activate            在窗口激活之前触发 02.Clicked             当用户用 ...

  3. MACD中短线交易系统

    1.MA5.MA10金叉,且股价收盘站稳5日均线 2.MACD金叉 3.MACD红绿柱 a.MACD红柱发散,表示多头力量增强,此时买入或加仓 b.MACD红柱收缩,表示多头力量减弱,此时卖出或减仓 ...

  4. async/await 的引用

    static async void Start() { string s = "ass"; Console.WriteLine(getMemory(s)+"Hello W ...

  5. express相关操作

    1.   安装应用生成器npm install express-generator –g 2.   生成项目Express --view=ejs myapp 3.   进入项目安装依赖包 npm in ...

  6. XML模块与类的定义

    xml模块 xml介绍: --XML 全称  可扩展标记语言 --<tag></tag>  双标签   标签中间可以加入文本信息 --<tag/>单标签  没有文本 ...

  7. 安卓开发之SimpleAdapter的使用

    package com.lidaochen.test; import android.support.v7.app.AppCompatActivity; import android.os.Bundl ...

  8. vue生命周期详细过程

  9. 6.单表的CRUD操作

    1.插入后用新id初始化被插入对象 <insert id="insertStudentCatchId"> insert into student (age,name,s ...

  10. 4.AOP原理模拟

    AOP   Aspect-Oriented-Programming    面向切面编程 a)是对面向对象的思维方式的有力补充 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码 a)Fil ...