首页 > 代码库 > Dijkstra算法

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 21 2 30 1 101 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算法