Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
2834: 回家的路
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 62 Solved: 38
[Submit][Status][Discuss]
Description

Input

Output

Sample Input
1 2
1 1 2 2
Sample Output
HINT
N<=20000,M<=100000
Source
#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,堆优化,分层图,最短路的更多相关文章
- BZOJ 2834: 回家的路 Dijkstra
按照横,竖为方向跑一个最短路即可,算是水题~ #include <bits/stdc++.h> #define N 200005 #define E 2000000 #define set ...
- bzoj 2834: 回家的路
题目 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser DCOI Logout 捐赠本站 Notice:1 ...
- BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级 分层图最短路 + Dijkstra
Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...
- P2939 [USACO09FEB]改造路Revamping Trails(分层图最短路)
传送门 完了我好像连分层图最短路都不会了……果然还是太菜了…… 具体来说就是记录一个步数表示免费了几条边,在dijkstra的时候以步数为第一关键字,距离为第二关键字.枚举边的时候分别枚举免不免费下一 ...
- BZOJ.2834.回家的路(最短路Dijkstra 拆点)
题目链接 对于相邻的.处在同在一行或一列的车站连边,然后用dis[x][0/1](或者拆点)分别表示之前是从横边还是竖边到x的,跑最短路. 我选择拆点.. //13028kb 604ms #inclu ...
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 -- 分层图最短路
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MB Description 每天,农夫 ...
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 深入理解dijkstra+堆优化
深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra 对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...
- POJ 2502 - Subway Dijkstra堆优化试水
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...
随机推荐
- 使用 Virtual Box 安装 android x86
1.安装 跟随别人的教程:http://www.maketecheasier.com/run-android-4-3-in-virtualbox/ 2.问题 安装过程出现以下问题:Kernel pan ...
- linux相关解压命令
ZIP 我们可以使用下列的命令压缩一个目录: # zip -r archive_name.zip directory_to_compress 下面是如果解压一个zip文档: # unzip archi ...
- 认识linux权限
首先,我们来了解下linux系统的用户和用户组 场景:公司里有两个项目组:小组A和小组B:A.B.C是小组A的成员,甲.乙是小组B的成员.为了保密起见,小组内的进度.文档.程序都有小组内公开.比如小组 ...
- JavaScript符串中每个单词的首字母大写化
map() + replace() function titleCase(str) { var convertToArray = str.toLowerCase().split(" &quo ...
- jquery解析XML(1)
jquery解析XML文件 html代码 <!DOCTYPE html><html><head><title>解析XML</title>&l ...
- chgrp命令
chgrp命令用于变更文件或目录的所属群组. 在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理.您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆 ...
- magento install
1: apt-get insatll apache2 mysql php5 2: 把下载的magneto 解压后放到 /var/www/magento 3: 进入 http://127. ...
- insert遭遇阻塞
insert的阻塞确实不常见,今天碰到了一个,看书又了解一个,整理下.1.多个会话同时向unique字段插入相同的值session1:首先建测试表test,并在字段id上创建一个主键索引(唯一键也可以 ...
- UIPageControll - 图片格式
设置pageCon的显示风格: 1. 颜色 page.pageIndicatorTintColor = [UIColor redColor]; page.currentPageIndicatorTin ...
- Memcached(一)在Windows上安装和测试memcached
1)下载memcached的windows安装程序 memcached-1.2.4-Win32-Preview-20080309_bin.zip 或其他版本 2)解压memcached 用管理员身份 ...