首页 > 代码库 > 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算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。