zoukankan      html  css  js  c++  java
  • Dijkstra算法

    Dijkstra算法是用来解决单源最短路的问题的...

    1.从当前距离s最短的点开始向它的邻边更新节点距离

    2.将更新后的节点放入队列中,用优先队列来维护这个节点

    3.重复以上操作,直到更新到最后一个节点

    输入

    第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道路,start和end表示起点和终点房间的编号。
    第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
    再接下来m行,每行3个空格分隔的整数x, y, z (0<z<=200)表示道路,表示从房间x到房间y(双向)的道路,注意,最多只有一条道路连结两个房间, 你需要的时间为z。
    输入保证从start到end至少有一条路径。
    输出
     
    一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。
     
    输入示例

    3 2 0 2
    1 2 3
    0 1 10
    1 2 11

    输出示例

    21 6

     这个题目就是个Dijkstra的模板题,然后它有一个特别的要求就是要计算一个最大得分,最大得分就在更新距离的时候顺便更新一下就好啦

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=505;
     4 const int INF=0x3f3f3f3f;
     5 vector<pair<int, int> >G[maxn];
     6 int p[maxn], d[maxn], sco[maxn];
     7 int main(){
     8     int n, m, s, e;
     9     priority_queue<pair<int, int> >que;
    10     while(cin>>n>>m>>s>>e){
    11         priority_queue<pair<int, int> >que;
    12         for(int i=0; i<n; i++)    cin>>p[i];
    13         int a, b, c;
    14         for(int i=0; i<m; i++){
    15             cin>>a>>b>>c;
    16             G[a].push_back(make_pair(b, c));
    17             G[b].push_back(make_pair(a, c));
    18         }
    19         for(int i=0; i<n; i++)    d[i]=INF;
    20         d[s]=0, sco[s]=p[s];
    21         que.push(make_pair(-d[s], s));
    22         while(que.size()){
    23             int now=que.top().second; que.pop();
    24             for(int i=0; i<G[now].size(); i++){
    25                 int v=G[now][i].first;
    26                 if(d[v]>d[now]+G[now][i].second){
    27                     d[v]=d[now]+G[now][i].second;
    28                     sco[v]=sco[now]+p[v];
    29                     que.push(make_pair(-d[v], v));
    30                 }else if(d[v]==d[now]+G[now][i].second && sco[v]<sco[now]+p[v]){
    31                     sco[v]=sco[now]+p[v];
    32                 }
    33             }
    34         }
    35                     cout<<d[e]<<" "<<sco[e]<<endl;
    36     }
    37     
    38     
    39     return 0;
    40 }
  • 相关阅读:
    不要再胡思乱想了
    sqoop和mysql之间导出问题
    reids3.0安装文档
    java面试
    java面试2
    大数据面试题 ---阿善有用
    rdd-api整理
    RDD弹性分布式数据集特性总结
    spark-on-yarn配置参数
    资源调度
  • 原文地址:https://www.cnblogs.com/ledoc/p/6561586.html
Copyright © 2011-2022 走看看