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 }