循环队列基础知识

1.循环队列需要几个参数来确定

循环队列需要2个参数,front和rear

2.循环队列各个参数的含义

(1)队列初始化时,front和rear值都为零;

(2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;

(3)当队列为空时,front与rear的值相等,但不一定为零;

3.循环队列入队的伪算法

(1)把值存在rear所在的位置;

(2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;

4.循环队列出队的伪算法

(1)先保存出队的值;

(2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;

5.如何判断循环队列是否为空

if(front==rear)

队列空;

else

队列不空;

6.如何判断循环队列是否为满?

这个问题比较复杂,假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;

解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;

例题:

4152: [AMPPZ2014]The Captain

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 664  Solved: 256
[Submit][Status][Discuss]

Description

给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。

Input

第一行包含一个正整数n(2<=n<=200000),表示点数。
接下来n行,每行包含两个整数x[i],y[i](0<=x[i],y[i]<=10^9),依次表示每个点的坐标。
 
 

Output

一个整数,即最小费用。

Sample Input

5
2 2
1 1
4 5
7 1
6 7

Sample Output

2
首先,我们可以无视min,直接两点之间建一条|x2-x1|的边和一条|y2-y1|的边
可以发现,对于点(x1,y1),(x2,y2),(x3,y3),x1<x2<x3,则|x2-x1|+|x3-x2| = |x3-x1|
所以从x1连向x3用x坐标计算权值的边是没有用的。
Y同理
所以每个点只需要向上下左右最靠近的点连边,排序即可
先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作...然后就跑dijikstra,这个题目是卡spfa的。
而且dijistra不用队优化会超时的。呵呵~。
 #include<cstring>
#define N 200010
#define inf (unsigned long long)((1<<63)-1)/*直接复制(1<<63)-1是会出现-1的,在前面要有ull*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<algorithm>
struct Edge{
int v,last;
unsigned long long w;
}edge[N<<];
struct Jg{
int x,y;
}dian[N];
int head[N],X[N],Y[N],n,t=;
unsigned long long dis[N];
struct Dis{
int id;
unsigned long long d;
Dis(){d=inf;}
bool operator <(Dis K)
const{return d>K.d; }/*优先队列是默认大的元素在前,这个重载运算符只能对<,把他变成>即可*/
};
priority_queue<Dis>Q;
bool vis[N]={false};
inline int read()
{
int ret=,ff=;
char s=getchar();
while(s<''||s>'')
{
if(s=='-') ff=-;
s=getchar();
}
while(s>=''&&s<='')
{
ret=ret*+s-'';
s=getchar();
}
return ret*ff;
}
void input()
{
n=read();
for(int i=;i<=n;++i)
{
dian[i].x=read();dian[i].y=read();
X[i]=Y[i]=i;
}
}
bool cmpx(int a,int b)/*排序,a,b代表X[N]数组中的某两个元素,他们代表的是dian数组的编号*/
{
return dian[a].x<dian[b].x;
}
bool cmpy(int a,int b)
{
return dian[a].y<dian[b].y;
}
void add_edge(int a,int b,int falgg)
{
if(falgg==)
{
++t;
edge[t].v=b;
edge[t].w=abs(dian[a].x-dian[b].x);
edge[t].last=head[a];
head[a]=t;
}
else
{
++t;
edge[t].v=b;
edge[t].w=abs(dian[a].y-dian[b].y);
edge[t].last=head[a];
head[a]=t;
}
}
void build_line()
{/*先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作.*/
sort(X+,X+n+,cmpx);
for(int i=;i<=n;++i)
{
add_edge(X[i],X[i-],);
add_edge(X[i-],X[i],);
}
sort(Y+,Y+n+,cmpy);
for(int i=;i<=n;++i)
{
add_edge(Y[i],Y[i-],);
add_edge(Y[i-],Y[i],);
}
}
void dijkstra()
{
for(int i=;i<=n;++i)
dis[i]=inf;
dis[]=;
Dis now;
now.id=;now.d=;
Q.push(now);
while(!Q.empty())
{
Dis nowe=Q.top();
Q.pop();
if(dis[nowe.id]!=nowe.d)continue;
if(vis[nowe.id])continue;
vis[nowe.id]=true;
for(int l=head[nowe.id];l;l=edge[l].last)
{
if(!vis[edge[l].v]&&dis[edge[l].v]>dis[nowe.id]+edge[l].w)
{
dis[edge[l].v]=dis[nowe.id]+edge[l].w;
Dis now;
now.id=edge[l].v;now.d=dis[edge[l].v];
Q.push(now);
}
}
}
}
int main()
{
input();
build_line();
dijkstra();
cout<<dis[n];
return ;
}

循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain的更多相关文章

  1. bzoj 4152[AMPPZ2014]The Captain

    bzoj 4152[AMPPZ2014]The Captain 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. ...

  2. BZOJ 4152: [AMPPZ2014]The Captain( 最短路 )

    先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作...然后就dijkstra ---------------------------------------------- ...

  3. HDU 2544 - 最短路 - [堆优化dijkstra][最短路模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Time Limit: 5000/1000 MS (Java/Others) Memory Li ...

  4. BZOJ 4152: [AMPPZ2014]The Captain Dijkstra+贪心

    Code: #include <queue> #include <cstdio> #include <cstring> #include <algorithm ...

  5. 堆优化Dijkstra计算最短路+路径计数

    今天考试的时候遇到了一道题需要路径计数,然而蒟蒻从来没有做过,所以在考场上真的一脸懵逼.然后出题人NaVi_Awson说明天考试还会卡SPFA,吓得我赶紧又来学一波堆优化的Dijkstra(之前只会S ...

  6. BZOJ 3040 最短路 (堆优化dijkstra)

    这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...

  7. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  8. 【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost

    [题目大意] 给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案. [思路] 在堆优化Dijkstra中,用pre记录前驱.如果新方案 ...

  9. PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS

    PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...

随机推荐

  1. C#中的索引器原理

    朋友们,还记得我们在C#语言开发中用到过索引器吗? 记得在获得DataGridView控件的某列值时:dgvlist.SelectedRows[0].Cells[0].Value; 记得在获得List ...

  2. Eclipse 出现Some sites could not be found. See the error log for more detail.错误 解决方法

    Eclipse 出现Some sites could not be found.  See the error log for more detail.错误 解决方法 Some sites could ...

  3. Android5.0新特性——图片和颜色(drawable)

    图片和颜色 tint属性 tint属性一个颜色值,可以对图片做颜色渲染,我们可以给view的背景设置tint色值,给ImageView的图片设置tint色值,也可以给任意Drawable或者NineP ...

  4. java多线程生产者消费者

    //Java Thread producer customer class ThreadTest { public static void main(String[] args) { Q q=new ...

  5. MS10-046漏洞测试

    这次用到MS10-046这个远程执行漏洞(Windows快捷方式LNK文件自动执行代码漏洞攻击) 命令: 1.   msfconsole    //启动MSF Metasploit 2.   sear ...

  6. SharePoint 中关于event receivers的讨论

    今天一早,跟几个小伙伴在群里讨论了有关事件触发器的东西,感觉收获颇多,拿出来和大家分享.讨论的内容,主要就是关于事件触发器的同步/异步的设置以及作用. 其实接触SharePoint颇久,对于事件触发器 ...

  7. 转:Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  8. iOS 视频播放 - YVideoPlayer - UIView

    这是一个使用简便的视频播放框架,它基于UIView,它可以是一个小窗口,也可以是一个全屏的窗口 简单的方式加载Video框架: 一行代码加载! 一行代码更新! 下载链接 : https://githu ...

  9. Xcode证书路径和缓存清理路径

    1.Xcode证书路径: ~/Library/MobileDevice/Provisioning Profiles 2.Jenkines共享证书路径: /用户/共享/Jenkins/Library/M ...

  10. Python基础(9)--正则表达式

    正则表达式是一个很有用的工具,可处理复杂的字符匹配和替换工作.在Python中内置了一个re模块以支持正则表达式. 正则表达式有两种基本的操作,分别是匹配和替换. 匹配就是在一个文本字符串中搜索匹配一 ...