迪杰斯特拉算法C++实现
2016-01-25 02:11
501 查看
迪杰斯特拉算法是经典的定点求最短路的算法,其原理是用贪心算法维护一颗最短路径树。算法复杂度是
n^2,通过剪枝可以适当优化。
n^2,通过剪枝可以适当优化。
#include<iostream> using namespace std; const int MAX=20; const int INF=99999; typedef bool pathmatrix[MAX+1][MAX+1]; typedef int shortpathTable[MAX+1]; typedef struct{ int vexnum,arcnum; char vexs[MAX+1]; int arcs[MAX+1][MAX+1]; }MGraph; void create_MG(MGraph &G) { int i,j,v1,v2,w; cout<<"输入顶点和边的个数:"<<endl; cin>>G.vexnum>>G.arcnum; for(i=0;i<G.vexnum;i++) for(j=0;j<G.vexnum;j++) G.arcs[i][j]=INF; for(i=0;i<G.vexnum;i++) { cout<<"请输入第"<<i<<"个顶点:"<<endl; cin>>G.vexs[i]; } for(i=1;i<=G.arcnum;i++) { cout<<"输入边--格式:源点 终点 权值"<<endl; cout<<"如0 2 10 "<<endl; cin>>v1>>v2>>w; G.arcs[v1][v2]=w; } } void shortestpath_DIJ(MGraph &G,int v0,pathmatrix &P,shortpathTable &D) { bool final[MAX]; int v,w,j; for(v=0;v<G.vexnum;v++) { final[v]=false; D[v]=G.arcs[v0][v]; for(w=0;w<G.vexnum;w++) { P[v][w]=false; } if(D[v]<INF) { P[v][v0]=true; P[v][v]=true; } } D[v0]=0; final[v0]=true; for(v=1;v<G.vexnum;v++) { int min=INF; for(w=0;w<G.vexnum;w++) { if(!final[w]&&D[w]<min) { min=D[w]; v=w; } } final[v]=true; for(w=0;w<G.vexnum;w++) { if(!final[w]&&min+G.arcs[v][w]<D[w]) { D[w]=min+G.arcs[v][w]; for (j=0;j<G.vexnum;j++) P[w][j]==P[v][j]; P[w][w]=true; } } } } int main(void) { MGraph G; create_MG(G); pathmatrix P; shortpathTable D; shortestpath_DIJ(G,0,P,D); for(int i=0;i<G.vexnum;i++) { cout<<"v0到"<<i<<"的最短路"<<endl; for` int j=0;j<G.vexnum;j++) { cout<<P[i][j]; } cout<<"路径长度"<<D[i]<<endl; } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析
- C++高级程序员成长之路
- C++编写简单的打靶游戏