Dijkstra 算法最短路模板
2017-04-10 22:28
417 查看
Dijkstra 算法
从单个源点出发,到所有节点的最短路
#include<iostream> #include<vector> #include<cstring> #include<queue> #define maxn 100 #define INF 100000 using namespace std; struct Edge{ int from,to,dis; Edge(int u,int v,int d):from(u),to(v),dis(d){} }; struct HeapNode{//最小d值和对应的结点编号 int d,u; bool operator <(const HeapNode &rhs) const{ return d>rhs.d; } }; struct Dijkstra{ int n,m; vector<Edge> edge;//存放图中各条边的情况 vector<int> G[maxn];//从G[u]出发对应的边的编号,方便寻找到各边 bool done[maxn];//是否已访问 int d[maxn];//源点到各边的情况 int p[maxn];//最短路中的一条边 void init(int n){//初始化 this->n=n; for(int i=0;i<n;i++) G[i].clear(); edge.clear(); } void AddEdge(int from,int to,int dis){//添加边 edge.push_back(Edge(from,to,dis));//如果是无向图,需要调用两次 m=edge.size(); G[from].push_back(m-1); } void dijkstra(int s){//求s到所有点的距离 priority_queue<HeapNode> Q; for(int i=0;i<n;i++) d[i]=INF; d[s]=0; memset(done,0,sizeof(done)); Q.push(HeapNode{0,s}); while(!Q.empty()){ HeapNode x=Q.top();Q.pop(); int u=x.u; if(done[u]) continue; done[u]=true; for(int i=0;i<G[u].size();i++){ Edge &e=edge[G[u][i]]; if(d[e.to]>d[u]+e.dis){ d[e.to]=d[u]+e.dis; p[e.to]=G[u][i]; Q.push(HeapNode{d[e.to],e.to}); } } } } }; int main(){ int n,m; scanf("%d%d",&n,&m); Dijkstra dt; dt.init(n); for(int i=0;i<m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); dt.AddEdge(a,b,c); } dt.dijkstra(0); for(int i=0;i<n;i++){ cout<<dt.d[i]<<endl; } return 0; }
相关文章推荐
- 【数据结构】有向图、无向图以及最短路(Dijkstra, Floyd)算法的C#实现(纯模板Template实现)
- 模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法
- uva 11374 最短路+记录路径 好题 dijkstra优先队列优化算法 邻接表法 可做模板 G++提交
- Dijkstra 单源最短路 模板 uva11374
- 最短路的几种算法及其优化(模板)
- dijkstra 优先队列最短路模板
- uva 11374 最短路+记录路径 dijkstra最短路模板
- [算法] poj 2387 单源最短路 Dijkstra
- Dijkstra 算法 sdut acm 2143 图结构练习 ---最短路
- uva 11374 最短路+记录路径 dijkstra最短路模板
- HDU 2544最短路dijkstra模板题
- Dijkstra求单源最短路模板
- 蓝桥杯 算法训练 最短路(最短路模板)
- 最短路之dijkstra 算法
- 最短路模板 floyd+dijkstra+spfa
- 【数据结构】有向图、无向图以及最短路(Dijkstra)算法的C#实现(Template模式)
- 带信号灯的最短路dijkstra问题(阿里巴巴2018校园招聘算法题)
- 畅联通工程续(最短路 算法模板。。。)
- 【最短路三算法】Floyd,Dijkstra,SPFA.
- 算法模板之次短路