求最短路 dijkstra算法
搞清各个变量的意义
不断更新点
#include <map>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct edge {
edge(int a, int b){
to = a;
cost = b;
}
int to, cost;
}; // to:能去的下一个点 cost:权值 edge:这个点连接的边
typedef pair<int, int> P; // <最小距离,当前点>
int M; //总边数
int V; //总点数
int start; //起点
int mend; //目标点
int path[10000]; //最短路径
int eve[10000]; //每个点的人数
int sum[10000]; //最短路条数
int man[10000]; //最大人数
vector<edge> G[1000]; //这个点连接的边有哪些
int d[10000]; //到当前点距离
void dijkstra(int s){
priority_queue<P, vector<P>, greater<P> > que; //存储到每个点的最短距离
fill(path,path+V,-1);
fill(d,d+V, 100000000);
d[s]=0;
sum[s]=1;
man[s]=eve[s];
que.push(P(0,s));
while(!que.empty()){
P p = que.top(); que.pop();
int v = p.second;
if(d[v] < p.first) continue;
for(int i=0; i<G[v].size();i++){
edge e=G[v][i];
if(d[e.to]>e.cost+d[v]){
d[e.to]=e.cost+d[v];
path[e.to]=v;
man[e.to]=man[v]+eve[e.to];
sum[e.to]=sum[v];
que.push(P(d[e.to],e.to));
}
else if(d[e.to]==d[v]+e.cost){
sum[e.to] += sum[v];
if(man[v]+eve[e.to]>man[e.to]) man[e.to] = man[v] + eve[e.to];
}
}
}
}
int main()
{
cin >> V >> M >> start >> mend;
for(int i=0; i<V; i++) cin >> eve[i];
for(int j=0; j<M; j++){
int z, x, c;
cin >> z >> x >> c;
G[z].push_back(edge(x,c));
G[x].push_back(edge(z,c));
}
dijkstra(start);
// printf("%d %d",sum[mend],man[mend]);
vector<int> pat;
for(int t=mend; t!=-1; t=path[t]) pat.push_back(t);
int y = pat.size();
for(int r=y-1; r>=0; r--) cout << pat[r] << " ";
return 0;
}