主要有三种
1.priority_queue <int> i;
priority_queue <double> d;
自动由大到小排序
2.struct node
{ int x,y;
bool operator < (const node & a) const
{ return x<a.x; } //若需要有小到大排序就把这一行的< 改成 >
}
对结构体指定元素排序(只能重载小于号)
3.priority_queue <int,vector<int>,less<int> > p; (注意两个>之间要有空格)由大到小
priority_queue <int,vector<int>,greater<int> > q; 由小到大
这三个参数的里面的类型要一致
主要用用途是自动排序,pair类型排序第一个元素,其他函数与普通队列没区别
q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素
q.back();//返回q的末尾元素
附迪杰斯特拉用vector邻接表和优先队列实现代码
#include<cstdio>
#include<cstring>
#include<utility>
#include<queue>
#include<vector>
using namespace std;
const int N=105;
const int INF=9999999;
typedef pair<int,int>pii;
vector<pii>G[N];
priority_queue<pii, vector<pii>, greater<pii> >q;
int d[N], first[N], u[N], v[N], w[N], next[N],n,m;
bool vis[N];
// 无向图的输入,注意没输入的一条边要看作是两条边
void read_graph(){
for(int i=1; i<=n; ++i)
G[i].clear();
int a,b,c;
for(int i=1; i<=m; ++i){
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(make_pair(b,c));
G[b].push_back(make_pair(a,c));
}
}
void Dijkstra(int src){
memset(vis, 0, sizeof(vis));
for(int i=1; i<=n; ++i) d[i] = INF;
d[src] = 0;
q.push(make_pair(d[src], src));
while(!q.empty()){
pii t = q.top(); q.pop();
int u = t.second;
if(vis[u]) continue;
vis[u] = true;
for(int v=0; v<G[u].size(); ++v)if(d[G[u][v].first] > d[u]+G[u][v].second){
d[G[u][v].first] = d[u]+G[u][v].second;
q.push(make_pair(d[G[u][v].first], G[u][v].first));
}
}
}
int main(){
int a,b,c;
while(~scanf("%d%d",&n,&m)&&n+m){
read_graph();
Dijkstra(1);
printf("%d\n", d[n]);
}
return 0;
}