基于STL的队列略解
什么是STL
以下内容摘自这儿。
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
队列
队列 是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的STL实现
声明队列需要加载头文件
#include<queue>
#include<algorithm>
使用 std 名字空间
using namespace std;
定义一个存储 int 类型的队列 q
queue<int> q;
使用STL的缺点,就是常数大。
下面我们以 为例,讲解 queue 的具体调用方法。
题目描述
一张有向边权图 中,给定一点 ,求 到其他各点的最短路径长。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#define reg register
using namespace std;
struct node{
int x,y,d,next;
}e[500010];
int len=0;
int first[10010];
int n,m,ST;
queue<int> q;
bool v[10010];
int s1,s2,s3;
int f[10010];
void ins(int x,int y,int d){
e[++len].x=x;e[len].y=y;e[len].d=d;
e[len].next=first[x];first[x]=len;
}
int main(){
scanf("%d%d%d",&n,&m,&ST);
for(reg int i=1;i<=m;++i){
scanf("%d%d%d",&s1,&s2,&s3);
ins(s1,s2,s3);
}
memset(v,1,sizeof(v));v[ST]=0;
memset(f,63,sizeof(f));f[ST]=0;
q.push(ST); //将ST压入队列
while(!q.empty()){
int x=q.front(); //取出队首的元素
for(reg int i=first[x];i;i=e[i].next){
int y=e[i].y;
if(f[y]>f[x]+e[i].d){
f[y]=f[x]+e[i].d;
if(v[y]){
v[y]=0;
q.push(y); //将y压入队列
}
}
}
q.pop(); //弹出队尾元素
v[x]=1;
}
for(reg int i=1;i<=n;++i)
printf("%d ",f[i]==1061109567?2147483647:f[i]);
}

浙公网安备 33010602011771号