2834: 回家的路

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 62  Solved: 38
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

2 1
1 2
1 1 2 2

Sample Output

5

HINT

N<=20000,M<=100000

Source

dijkstra+堆优化+分层图
把所有的横向和纵向分开看。跑最短路即可。
注意:N这么大,不能写N^2建图。要把M个位置去建图。
 #include<bits/stdc++.h>
using namespace std;
#define MAXN 20010
#define MAXM 100010
#define INF 1e9
struct NODE
{
int begin,end,value,next;
}edge[*MAXM+];
struct node
{
int x,y,id;
}a[MAXM+];
int cnt,Head[*MAXM+],pos[*MAXM+],Heap[*MAXM+],dis[*MAXM+],N,SIZE;
void addedge(int bb,int ee,int vv)
{
edge[++cnt].begin=bb;edge[cnt].end=ee;edge[cnt].value=vv;edge[cnt].next=Head[bb];Head[bb]=cnt;
}
void addedge1(int bb,int ee,int vv)
{
addedge(bb,ee,vv);addedge(ee,bb,vv);
}
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
//int xy(int x,int y){return (x-1)*n+y;}
void Push1(int k)
{
int now=k,root;
while(now>)
{
root=now/;
if(dis[Heap[root]]<=dis[Heap[now]])return;
swap(Heap[root],Heap[now]);
swap(pos[Heap[root]],pos[Heap[now]]);
now=root;
}
}
void Insert(int k)
{
Heap[++SIZE]=k;pos[k]=SIZE;Push1(SIZE);
}
void Pop1(int k)
{
int now,root=k;
pos[Heap[k]]=;Heap[k]=Heap[SIZE--];if(SIZE>)pos[Heap[k]]=k;
while(root<=SIZE/)
{
now=root*;
if(now<SIZE&&dis[Heap[now+]]<dis[Heap[now]])now++;
if(dis[Heap[root]]<=dis[Heap[now]])return;
swap(Heap[root],Heap[now]);
swap(pos[Heap[root]],pos[Heap[now]]);
root=now;
}
}
void dijkstra(int start)
{
int i,u,v;
for(i=;i<=N;i++)dis[i]=INF;dis[start]=;
for(i=;i<=N;i++)Insert(i);
while(SIZE>)
{
u=Heap[];Pop1(pos[u]);
for(i=Head[u];i!=-;i=edge[i].next)
{
v=edge[i].end;
if(dis[v]>dis[u]+edge[i].value){dis[v]=dis[u]+edge[i].value;Push1(pos[v]);}
}
}
}
bool cmp1(node aa,node bb)
{
if(aa.x==bb.x)return aa.y<bb.y;
return aa.x<bb.x;
}
bool cmp2(node aa,node bb)
{
if(aa.y==bb.y)return aa.x<bb.x;
return aa.y<bb.y;
}
int main()
{
int n,m,i,k,k1,bx,by,ex,ey;
n=read();m=read();
memset(Head,-,sizeof(Head));cnt=;
N=*m+;
for(i=;i<=m+;i++)a[i].x=read(),a[i].y=read(),a[i].id=i;
sort(a+,a+m+,cmp1);
for(i=;i<=m+;i++)
{
if(a[i].x==a[i+].x)addedge1(a[i].id,a[i+].id,*(a[i+].y-a[i].y));
}
sort(a+,a+m+,cmp2);
for(i=;i<=m+;i++)
{
if(a[i].y==a[i+].y)addedge1(a[i].id+m+,a[i+].id+m+,*(a[i+].x-a[i].x));
}
for(i=;i<=m;i++)addedge1(i,i+m+,);
addedge1(m+,m++m+,);addedge1(m+,m++m+,);
dijkstra(m+);
if(dis[m+]!=INF)printf("%d",dis[m+]);
else printf("-1");
/*不看n的范围的后果。。。写了个n^2的建图。。。
for(i=1;i<=m;i++)
{
x=read();y=read();
k=xy(x,y);
addedge1(k,n*n+k,1);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i<n){k=xy(i,j);k1=xy(i+1,j);addedge1(k,k1,2);addedge1(k+n*n,k1+n*n,2);}
if(j<n){k=xy(i,j);k1=xy(i,j+1);addedge1(k,k1,2);addedge1(k+n*n,k1+n*n,2);}
}
}
N=2*n*n;
bx=read();by=read();ex=read();ey=read();
addedge1(xy(bx,by),xy(bx,by)+n*n,0);
addedge1(xy(ex,ey),xy(ex,ey)+n*n,0);
dijkstra(xy(bx,by));
if(dis[xy(ex,ey)]!=INF)printf("%d",dis[xy(ex,ey)]);
else printf("-1");*/
fclose(stdin);
fclose(stdout);
return ;
}

Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路的更多相关文章

  1. BZOJ 2834: 回家的路 Dijkstra

    按照横,竖为方向跑一个最短路即可,算是水题~ #include <bits/stdc++.h> #define N 200005 #define E 2000000 #define set ...

  2. bzoj 2834: 回家的路

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

  3. BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级 分层图最短路 + Dijkstra

    Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...

  4. P2939 [USACO09FEB]改造路Revamping Trails(分层图最短路)

    传送门 完了我好像连分层图最短路都不会了……果然还是太菜了…… 具体来说就是记录一个步数表示免费了几条边,在dijkstra的时候以步数为第一关键字,距离为第二关键字.枚举边的时候分别枚举免不免费下一 ...

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

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

  6. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 -- 分层图最短路

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MB Description 每天,农夫 ...

  7. hdu 2544 单源最短路问题 dijkstra+堆优化模板

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. 深入理解dijkstra+堆优化

    深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra   对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...

  9. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

随机推荐

  1. spark - 将RDD保存到RMDB(MYSQL)数据库中

    SCALA连接数据库批量插入: scala> import java.sql.DriverManager scala> var url = "jdbc:mysql://local ...

  2. 递归查找某个目录下是否存在NOTICE文件

    从Catalogs.txt文件中,读取待检查的目录列表.检查这些目录中,是否存在NOTICE文件,如果没有则检查它的父目录,直到cd ..到Repository目录. 如果cd ..到Reposito ...

  3. C#基础(一)——C#中反斜杠/n与/r的区别

    最近在公司实习的过程中,遇到了字符串换行的问题,百度了一下,发现字符串换行的问题还挺多,总结一下最基本的点,以防忘记. \n—>换行符(New Line),作用为换行符后面的字符串显示到“下一行 ...

  4. Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法 转

    Java调用.Net WebService参数为空解决办法 (远程)调试webservice方法   同事遇到一个很囧的问题,java调,netwebservice的时候,调用无参数方法成功,调用有参 ...

  5. Log4j 密码屏蔽

    Log4j filter to mask Payment Card numbers (PCI DSS) According to PCI DSS (Payment Card Industry Data ...

  6. hadoop1中mapreduce原理详解

    剖析Mapreduce作业运行机制:原理如下图: 原理图的解释的可以分为以下几个部分 1.客户端提交一个mapreduce的jar包给JobClient 2.JocClient通过RPC和JobTra ...

  7. 强大DevExpress,Winform LookUpEdit 实现多列查询 gridview弹出下拉选择 z

    关键代码请参考http://www.devexpress.com/Support/Center/p/K18333.aspx 最新DEMO 下载 The current GridLookUpEdit's ...

  8. 简单的网页采集程序(ASP.NET MVC4)

    因为懒人太多,造成现在网页数据采集非常的流行,我也来写个简单的记录一下. 之前写了MVC的基本框架的搭建随笔,后面因为公司太忙,个人感情问题:(,导致不想写了,就写了两篇给删除了,现在就搁浅了, 本人 ...

  9. 修改tabbar 字体颜色

    NSDictionary *seletedTextAttrs = @{NSForegroundColorAttributeName:[UIColor orangeColor]}; 修改tabbar 字 ...

  10. asp.net mvc4 Controller与Action执行过程的研究(学习笔记)

    当IIS收到一个http请求,把请求信息发给对应的HttpModel(实际是实现类UrlRoutingModule),在HttpModel中会注册HttpApplication 类中的PostReso ...