[dijkstra]
2015-09-14 22:12
323 查看
#include<bits/stdc++.h> using namespace std; const int INF = 0x7f7f7f7f; const int maxn = 10000; struct Edge{ int from,to,dist; Edge(int u,int v,int d):from(u),to(v),dist(d) {} }; struct HeapNode{ int d,u; bool operator < (const HeapNode& rhs) const { return d >rhs.d; } }; struct Dijkstra{ int n,m; vector<Edge> edges; vector<int> G[maxn]; bool done[maxn]; //是否已永久标号 int d[maxn]; //s到各个点的距离 int p[maxn]; //最短路中的上一条弧 void init(int n){ for(int i=0;i<n;i++) G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int dist){ edges.push_back(Edge(from,to,dist)); m=edges.size(); G[from].push_back(m-1); } void dijkstra(int 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=edges[ G[u][i] ]; if(d[e.to] > d[u] + e.dist){ d[e.to]=d[u]+e.dist; p[e.to]=G[u][i]; Q.push((HeapNode){d[e.to],e.to}); } } } } }; int main() { Dijkstra a; int M; scanf("%d%d",&a.n,&M); a.init(a.n); while(M--){ int x,y,z; scanf("%d%d",&x,&y); // printf("%d%d%d\n",x,y,); a.AddEdge(x-1,y-1,1); } a.dijkstra(0); for(int i=0;i<=a.n;i++) printf("%d\n",a.d[i]); return 0; } /* 6 6 1 2 2 3 1 3 2 5 2 6 3 4 */
相关文章推荐
- 探讨read的返回值的三种情况
- 电脑内无法预览图片
- eclipse 快捷键
- 用js实现跳转页面的方法
- android学习之路之接口回调的理解
- C++的STL进一步总结之pair
- 标准SQL的update语句三种用法
- POJ 1703 Find them, Catch them(经典并查集)
- hdu 4462 构造子集+枚举
- rectint 函数
- 原生js实现跑马灯抽奖效果
- 二、面向对象设计三大特性-----《大话设计模式》
- PS技巧:如何优雅的抠公章?
- 从图看Linux问题分析的工具
- Linux yum配置
- 磁盘管理和文件系统
- java__集合的工具类
- lintcode-最长公共子串-79
- iOS:切换视图时,反向传递数据方法一:通知
- Pointable类(Leap::Pointable)