zoukankan      html  css  js  c++  java
  • 使用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 }
  • 相关阅读:
    hdoj 2063 过山车
    hdoj 2112 HDU Today
    hdoj 1874 畅通工程续
    hdoj 2544 最短路
    sound of the genuine
    复习webpack的常用loader
    node-sass安装报错
    react-debug
    react-router 4v 路由嵌套问题
    React 中使用sass
  • 原文地址:https://www.cnblogs.com/lijianlin1995/p/3616992.html
Copyright © 2011-2022 走看看