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; }
相关文章推荐
- pat甲级_路径问题(例题:pat 1003 Emergency (25))
- pat 甲级 1003 Emergency
- PAT甲级1003---迷宫问题(DFS或Dijkstra)
- 【PAT】甲级1003 - Emergency(最短路)
- PAT 甲级 1003
- PAT 甲级试题1003 Emergency (25) dijkstra变形应用
- PAT甲级 1003
- Pat 1003 甲级
- PAT甲级练习题1003
- PAT甲级1003(深搜)
- 浙大Pat | 浙大pat 牛客网甲级 1003 Highest Price in Supply Chain (25)DFS
- PAT程序设计考题——甲级1003(Emergency ) C++实现
- PAT(甲级)1003
- PAT甲级C语言.1003. 我要通过!
- PAT甲级 1003
- [PAT-甲级]1003.Emergency
- PAT 甲级练习 1003
- pat 甲级 1003
- 浙大PAT甲级-1003
- PAT-甲级-1003