使用priority_queue实现Dijkstra

主要是记得传比较算子进去,优先队列要的那个算子参数大概是用来定义优先级的,默认是less,大概是优先级低的先出队。想要从小到大排序要传greater进去。

 1     priority_queue< edge,vector<edge>,greater<edge> > Q;
 2     Q.push(make_pair(0,1));dis[1]=0;
 3     while(!Q.empty()){
 4         int u=Q.top().second;Q.pop();
 5         if(finish[u])continue;
 6         cout<<u<<','<<dis[u]<<endl;
 7         finish[u]=1;
 8 
 9         for(vector< edge >::iterator ite=G[u].begin();ite!=G[u].end();ite++){
10             int w=ite->second,v=ite->first;
11             if(dis[u]+w<dis[v]){
12                 dis[v]=dis[u]+w;
13                 Q.push(make_pair(dis[v],v));
14             }
15         }
16     }

poj2442 Sequence 

http://poj.org/problem?id=2442

先看只有两组数列的情况,考虑这样一个事实,因为两组合并时产生的n*n个数字中,前n个小的一定比其他的更优,所以考虑一组一组处理,先将第一二组处理,然后用处理的结果跟第三组处理。第一遍写将n*n个数组进行了sort,tle,然后用了堆,保持堆的元素个数是n,复杂度从O(m*n^2*log n*n )变成O(m*n^2*logn)

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <queue>
 4 
 5 using namespace std;
 6 
 7 const int maxn = 2000+10;
 8 
 9 int v[2][maxn],A[maxn*maxn];
10 
11 int main(int argc, char const *argv[])
12 {
13     int T;scanf("%d",&T);
14     while(T--){
15         int m,n;
16         scanf("%d%d",&m,&n);
17         for(int i=0;i<n;i++)
18             scanf("%d",&v[0][i]);
19 
20         priority_queue< int > Q;
21 
22         for(int ord=1;ord<m;ord++){
23             for(int i=0;i<n;i++){
24                 scanf("%d",&v[1][i]);
25                 for(int j=0;j<n;j++){
26                     int A=v[1][i]+v[0][j];
27                     if(Q.size()<n)
28                         Q.push(A);
29                     else{
30                         if(A<Q.top()){
31                             Q.pop();
32                             Q.push(A);
33                         }
34                     }
35                 }
36             }
37             for(int i=0;i<n;i++){
38                 v[0][i]=Q.top();
39                 Q.pop();
40             }
41         }
42         for(int i=n-1;i>=0;i--)
43             printf("%d%c",v[0][i]," 
"[i==0]);
44     }
45     return 0;
46 }
原文地址:https://www.cnblogs.com/lijianlin1995/p/3616992.html