【图】单源最短路径dijkstra
来源:互联网 发布:盒子鱼软件下载 编辑:程序博客网 时间:2024/05/29 15:08
O(n^2)级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;//terrariaconst 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;}
0 0
- 【图】单源最短路径dijkstra
- Dijkstra算法求图的单源最短路径
- poj1062-子图dijkstra单源最短路径问题
- 图的单源最短路径:Dijkstra算法实现
- 图的单源最短路径--Dijkstra算法
- 图的单源最短路径Dijkstra算法
- <C/C++图>单源最短路径:Dijkstra算法
- 单源最短路径 dijkstra算法
- 单源最短路径Dijkstra算法
- Dijkstra 单源最短路径算法
- 单源最短路径 :Dijkstra 算法
- Dijkstra单源最短路径
- Dijkstra单源最短路径
- 单源最短路径(Dijkstra算法)
- Dijkstra 单源最短路径
- Dijkstra 单源最短路径
- 单源最短路径----------Dijkstra算法
- Dijkstra单源最短路径
- 走进小作坊(八)----公益之痒
- 堆和栈区别 生长方向
- Myeclipse在启动tomcat的时候的模式改变
- Spark:一个高效的分布式计算系统
- strtok理解
- 【图】单源最短路径dijkstra
- opennms图片
- c14
- 二叉排序树删除值小于value的结点
- java中,如何安全的结束一个正在运行的线程?
- Cocos2D-X2.2.3学习笔记5(UI系统)
- 蓝桥杯 装箱问题
- 遍历目录
- android欢迎界面怎么屏蔽掉标题栏