基于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的缺点,就是常数大。

下面我们以 luoguP3371\text{luoguP3371}为例,讲解 queue 的具体调用方法。



题目描述 luoguP3371\text{luoguP3371}

一张有向边权图 GG 中,给定一点 STST,求 STST 到其他各点的最短路径长。

Solution 3371\text{Solution 3371}

#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]);
}
posted @ 2019-04-16 15:57  TeacherDai  阅读(122)  评论(0)    收藏  举报