您的位置:首页 > 其它

pat 甲级 1003

2018-03-18 17:01 309 查看
求最短路 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: