【图】单源最短路径dijkstra
2014-05-12 21:07
459 查看
O(n^2)级C算法,简易复习用
C++优先队列优化版
汝佳的代码
#include<stdio.h> #include<string.h> #include<algorithm> #include<cstdlib> using namespace std; const int INF = 1000000000; const int MAXN = 1000; int n, m; int v[MAXN], d[MAXN], G[MAXN][MAXN]; int main() { scanf("%d%d", &n, &m); for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) G[i][j] = INF; for(int i = 0; i < m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); G[u][v] = w; } memset(v, 0, sizeof(v)); for(int i = 0; i < n; i++) d[i] = (i==0 ? 0 : INF); for(int i = 0; i < n; i++) { int x, m = INF; for(int y = 0; y < n; y++) if(!v[y] && d[y]<=m) m = d[x=y]; //选出所有未被遍历的点中d值最小的节点x,即到始点最短的点 v[x] = 1;//标记点x for(int y = 0; y < n; y++) d[y] = min(d[y], d[x] + G[x][y]);//更新 } for(int i = 0; i < n; i++) printf("d[%d] = %d\n", i, d[i]); return 0; }
C++优先队列优化版
struct Edge { int from,to,dist } struct HeapNode { int d,u;//d是距离,u是节点号 bool operator < (const HeapNode& rhs) const { return d>rhs.d; } }; struct Dijkstra { int n,m;//vertices and edges vector<Edge> edges; vector<int> G[maxn]; 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(); 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(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}); } } } } }
汝佳的代码
#include<cstdio> #include<cstring> #include<queue> using namespace std; //terraria const int INF = 1000000000; const int MAXN = 1000; const int MAXM = 100000; int n, m; int first[MAXN], d[MAXN]; int u[MAXM], v[MAXM], w[MAXM], next[MAXM]; typedef pair<int,int> pii; int main(void) {//读入及初始化 scanf("%d%d", &n, &m); for(int i = 0; i < n; i++) first[i] = -1; for(int e = 0; e < m; e++) { scanf("%d%d%d", &u[e], &v[e], &w[e]); next[e] = first[u[e]]; first[u[e]] = e; } priority_queue<pii, vector<pii>, greater<pii> > q;//优先队列 //bool done[MAXN]; for(int i = 0; i < n; i++) d[i] = (i==0 ? 0 : INF);//将所有非0值置为最大 //memset(done, 0, sizeof(done)); q.push(make_pair(d[0], 0)); while(!q.empty()) { pii u = q.top(); q.pop(); int x = u.second; if(x==3) printf("3 occurs, u.first=%d, d[3]=%d\n", u.first, d[3]); if(u.first != d[x]) {printf("node #%d: first=%d, d[x]=%d, continue\n", x,u.first,d[x]); continue;} //done[x] = true; if(x==3) printf("3 using, d[3] = %d\n", d[3]); for(int e = first[x]; e != -1; e = next[e]) if(d[v[e]] > d[x]+w[e]) { d[v[e]] = d[x] + w[e]; q.push(make_pair(d[v[e]], v[e])); printf("%d kuozhanle %d, d=%d\n",x, v[e], d[v[e]]); } } for(int i = 0; i < n; i++) printf("d[%d] = %d\n", i, d[i]); while(1); return 0; }
相关文章推荐
- 杭电1874————单源最短路径(dijkstra)
- Dijkstra 单源最短路径
- 单源最短路径(Dijkstra)算法
- 单源最短路径---Dijkstra 算法--路径还原
- Dijkstra 求单源最短路径
- java dijkstra 单源 最短路径 优先队列 n趟
- 洛谷P3371 单源最短路径(Dijkstra+堆优化)
- [算法导论] 单源最短路径 - Dijkstra 学习笔记
- 贪心算法--Dijkstra单源最短路径
- PAT 1003 Emergency(单源最短路径+Dijkstra)
- Dijkstra单源最短路径算法; 优先队列+静态数组邻接表; STL优先队列还是没想明白排序原则;
- Java实现Dijkstra单源最短路径
- 单源最短路径长度Dijkstra(迪杰斯特拉)算法
- 算法导论-第24章- 单源最短路径 - 24.3 Dijkstra 算法
- Dijkstra单源最短路径(贪心选择)
- 洛谷 P3371 【模板】单源最短路径(Dijkstra + 堆优化)
- 贪心算法 最小生成树prim与单源最短路径dijkstra
- 单源最短路径<Dijkstra>
- 贪心算法--Dijkstra单源最短路径
- hdu 2544 单源最短路径(邻接矩阵Dijkstra实现)