码迷,mamicode.com
首页 > 编程语言 > 详细

Dijkstra算法

时间:2017-03-16 22:06:31      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:clu   blog   for   top   需要   start   out   names   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 }

 

Dijkstra算法

标签:clu   blog   for   top   需要   start   out   names   dijkstra   

原文地址:http://www.cnblogs.com/ledoc/p/6561586.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!