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

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个位置去建图。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define MAXN 20010
  4 #define MAXM 100010
  5 #define INF 1e9
  6 struct NODE
  7 {
  8     int begin,end,value,next;
  9 }edge[6*MAXM+10];
 10 struct node
 11 {
 12     int x,y,id;
 13 }a[MAXM+10];
 14 int cnt,Head[2*MAXM+10],pos[2*MAXM+10],Heap[2*MAXM+10],dis[2*MAXM+10],N,SIZE;
 15 void addedge(int bb,int ee,int vv)
 16 {
 17     edge[++cnt].begin=bb;edge[cnt].end=ee;edge[cnt].value=vv;edge[cnt].next=Head[bb];Head[bb]=cnt;
 18 }
 19 void addedge1(int bb,int ee,int vv)
 20 {
 21     addedge(bb,ee,vv);addedge(ee,bb,vv);
 22 }
 23 int read()
 24 {
 25     int s=0,fh=1;char ch=getchar();
 26     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)fh=-1;ch=getchar();}
 27     while(ch>=‘0‘&&ch<=‘9‘){s=s*10+(ch-‘0‘);ch=getchar();}
 28     return s*fh;
 29 }
 30 //int xy(int x,int y){return (x-1)*n+y;}
 31 void Push1(int k)
 32 {
 33     int now=k,root;
 34     while(now>1)
 35     {
 36         root=now/2;
 37         if(dis[Heap[root]]<=dis[Heap[now]])return;
 38         swap(Heap[root],Heap[now]);
 39         swap(pos[Heap[root]],pos[Heap[now]]);
 40         now=root;
 41     }
 42 }
 43 void Insert(int k)
 44 {
 45     Heap[++SIZE]=k;pos[k]=SIZE;Push1(SIZE);
 46 }
 47 void Pop1(int k)
 48 {
 49     int now,root=k;
 50     pos[Heap[k]]=0;Heap[k]=Heap[SIZE--];if(SIZE>0)pos[Heap[k]]=k;
 51     while(root<=SIZE/2)
 52     {
 53         now=root*2;
 54         if(now<SIZE&&dis[Heap[now+1]]<dis[Heap[now]])now++;
 55         if(dis[Heap[root]]<=dis[Heap[now]])return;
 56         swap(Heap[root],Heap[now]);
 57         swap(pos[Heap[root]],pos[Heap[now]]);
 58         root=now;
 59     }
 60 }
 61 void dijkstra(int start)
 62 {
 63     int i,u,v;
 64     for(i=1;i<=N;i++)dis[i]=INF;dis[start]=0;
 65     for(i=1;i<=N;i++)Insert(i);
 66     while(SIZE>0)
 67     {
 68         u=Heap[1];Pop1(pos[u]);
 69         for(i=Head[u];i!=-1;i=edge[i].next)
 70         {
 71             v=edge[i].end;
 72             if(dis[v]>dis[u]+edge[i].value){dis[v]=dis[u]+edge[i].value;Push1(pos[v]);}
 73         }
 74     }
 75 }
 76 bool cmp1(node aa,node bb)
 77 {
 78     if(aa.x==bb.x)return aa.y<bb.y;
 79     return aa.x<bb.x;
 80 }
 81 bool cmp2(node aa,node bb)
 82 {
 83     if(aa.y==bb.y)return aa.x<bb.x;
 84     return aa.y<bb.y;
 85 }
 86 int main()
 87 {
 88     int n,m,i,k,k1,bx,by,ex,ey;
 89     n=read();m=read();
 90     memset(Head,-1,sizeof(Head));cnt=1;
 91     N=2*m+4;
 92     for(i=1;i<=m+2;i++)a[i].x=read(),a[i].y=read(),a[i].id=i;
 93     sort(a+1,a+m+3,cmp1);
 94     for(i=1;i<=m+1;i++)
 95     {
 96         if(a[i].x==a[i+1].x)addedge1(a[i].id,a[i+1].id,2*(a[i+1].y-a[i].y));
 97     }
 98     sort(a+1,a+m+3,cmp2);
 99     for(i=1;i<=m+1;i++)
100     {
101         if(a[i].y==a[i+1].y)addedge1(a[i].id+m+2,a[i+1].id+m+2,2*(a[i+1].x-a[i].x));
102     }
103     for(i=1;i<=m;i++)addedge1(i,i+m+2,1);
104     addedge1(m+1,m+1+m+2,0);addedge1(m+2,m+2+m+2,0);
105     dijkstra(m+1);
106     if(dis[m+2]!=INF)printf("%d",dis[m+2]);
107     else printf("-1");
108     /*不看n的范围的后果。。。写了个n^2的建图。。。
109     for(i=1;i<=m;i++)
110     {
111         x=read();y=read();
112         k=xy(x,y);
113         addedge1(k,n*n+k,1);
114     }
115     for(i=1;i<=n;i++)
116     {
117         for(j=1;j<=n;j++)
118         {
119             if(i<n){k=xy(i,j);k1=xy(i+1,j);addedge1(k,k1,2);addedge1(k+n*n,k1+n*n,2);}
120             if(j<n){k=xy(i,j);k1=xy(i,j+1);addedge1(k,k1,2);addedge1(k+n*n,k1+n*n,2);}
121         }
122     }
123     N=2*n*n;
124     bx=read();by=read();ex=read();ey=read();
125     addedge1(xy(bx,by),xy(bx,by)+n*n,0);
126     addedge1(xy(ex,ey),xy(ex,ey)+n*n,0);
127     dijkstra(xy(bx,by));
128     if(dis[xy(ex,ey)]!=INF)printf("%d",dis[xy(ex,ey)]);
129     else printf("-1");*/
130     fclose(stdin);
131     fclose(stdout);
132     return 0;
133 }
时间: 2024-10-04 13:12:03

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

BZOJ 2834 回家的路

分层图最短路.边要开够. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxv 300500 #define maxe 2000500 #define inf 2147483647 using namespace std; struct pnt { int x,y,id; }p[maxv]; st

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

1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MB Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N; 1 <= P2_i<= N). John需要T_i (1 <= T_i <

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

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻

POJ 3013 Big Christmas Tree【最短路变形,DIjkstra堆优化+spfa算法】

Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23064   Accepted: 4987 Description Christmas is coming to KCM city. Suby the loyal civilian in KCM city is preparing a big neat Christmas tree. The simple structure of t

【日常学习】【Dijkstra堆优化】codevs2038 香甜的黄油题解

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake 先放上题目,出自USACO 题目描述 Description 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费用在奶牛上. 农夫John很狡猾.他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场.他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶. 农

Heap+Dijkstra堆优化的Dijkstra

前面说到"原生的Dijkstra",由于Dijkstra采用的是贪心策略,在贪心寻找当前距离源结点最短的结点时需要遍历所有的结点,这必然会导致效率的下降,时间复杂度为n^n.因此当数据量较大时会消耗较长时间.为了提高Dijkstra的效率,只有对Dijkstra的贪心策略进行改进. 由于Dijkstra采用的贪心策略是每次寻找最短距离的结点并将其放入存放所有已知最短距离结点的S集合中,可以联想到堆以及优先级队列这些数据结构,这些结构都能非常高效地提供当前状态距离最短的结点.实践也可以证

Poj 1151 Invitation Cards dijkstra 堆优化

很裸的最短路,不过节点数和边数都是1e6,直接dij肯定是不行了,稀疏图用heap优化一下就好 o(╯□╰)o注意STL里面的优先队列是优先级大的(值大的)在前面的,一开始没注意WA了好几发,哎,太粗心了 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #inc

Codeforces 787D. Legacy 线段树优化建图+最短路

output standard output Rick and his co-workers have made a new radioactive formula and a lot of bad guys are after them. So Rick wants to give his legacy to Morty before bad guys catch them. There are n planets in their universe numbered from 1 to n.

BZOJ 2118 墨墨的等式 堆优化Dijkstra

题目大意:给定n个物品,每个物品有一个非负价值,问[L,R]区间内有多少价值可以被凑出来 好题!!! 如果物品数量可以为负,显然求个gcd就行了 现在物品数量必须非负 任选一个ai>0,如果一个价值k?ai+x(0≤x<ai,k≥0)可以被凑出来,那么显然(k+1)?ai+x,(k+2)?ai+x,...都可以被凑出来 显然如果我们对于每个x都找到最小的k满足k?ai+x可以被凑出来,这个问题就解决了 那么怎么求呢?最短路,使用堆优化Dijkstra即可 时间复杂度O(n?ai?log2ai)