• 使用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 }
  • 相关阅读:
    实验四 (1):定义一个形状类(Shape)方法:计算周长,计算面积
    计算机结构的简化模型
    memcached性能测试之Twemperf
    Eclipse UML小工具AmaterasUML的配置和使用
    Kafka中文官方文档
    HBase Snapshot简介
    shell脚本学习系列之一---入门
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    vim常用操作
    Linux多台主机间配置SSH免密登陆
  • 原文地址:https://www.cnblogs.com/lijianlin1995/p/3616992.html
Copyright © 2020-2023  润新知