最短路
来源:互联网 发布:冰点还原 知乎 编辑:程序博客网 时间:2024/06/05 05:16
单源最短路问题就是求出图中源点到其它所有结点的最小距离。
Dijkstra算法每次找出距离源点最近的点,然后更新剩余所有点到源点的距离。
int n; //顶点数int m; //边数void init(){ int u,v,w; for(int i=1; i<=n; i++) for(int j=i; j<=n; j++) G[i][j] = G[j][i] = INF; for(int i=0; i<m; i++) { scanf("%d%d%d",&u,&v,&w); G[u][v] = w; }}void Dijkstra(int u){ int miin; int v; for(int i=1; i<=n; i++) { d[i] = INF; vis[i] = 0; } /*初始化*/ for(int i=1; i<=m; i++) d[i] = G[u][i]; vis[u] = 1; d[u] = 0; for(int i=1; i<n; i++) //加入其他的n-1个结点 { //寻找距离最近的结点 v = u; miin = INF; for(int j=1; j<=n; j++) { if(!vis[j] && d[j]<miin) { v = j; miin = d[j]; } } vis[v] = 1; //距离更新 for(int j=1; j<=n; j++) { if((!vis[j]) && G[v][j]<INF) { if(d[j]>d[v]+G[v][j]) { d[j] = d[v] + G[v][j]; } } } }}
Bellman-Ford算法对边进行松弛,参考了一个大神的博客。http://www.wutianqi.com/?p=1912。
typedef struct Edge{ int u,v; int w;} Edge;Edge edge[maxn];int dist[maxn];int n; //结点数int m; //边数int p; //源点void init(){ scanf("%d%d%d",&n,&m,&p); for(int i=0; i<=n; i++) dist[i] = INF; dist[p] = 0; for(int i=0; i<m; i++) { scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); if(edge[i].u == p) dist[edge[i].v] = edge[i].w; }}void relax(int u,int v,int w){ if(dist[u] + w < dist[v]) dist[v] = dist[u] + w;}bool Bellman-Ford(){ for(int i=0; i<n-1; i++) for(int j=0; j<m; j++) relax(edge[j].u,edge[i].v,edge[i].w); //判断是否有负环路 bool flag = 1; for(int i=0; i<m; i++) if(dist[edge[i].u]+dege[i].w<dist[dege[i].v]) { flag = 0; break; } return flag;}
Floyd算法的原理是动态规划。 假设Dist(u,v)代表u到v的最小距离,该路径可以是两个点直接相连,也可能中间经过好多点。对于所有的点k,看是否存在Dist(u,k)+Dist(k,v)<Dist(u,v),如果存在就更新。当便利万所有的k后,Dist(u,v)是最小的。
void Floyd(){ for(int k=0; k<n; k++) for(int i=0; i<n; i++) for(int j=0; j<n; j++) dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);}
0 0
- 最短路 & 次短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- Python:简单的文件备份脚本
- 关于职业规划
- OpenGL Tutorial: (1) Setting up OpenGL with Visual Studio
- Activity生命周期
- 将博客搬至51CTO
- 最短路
- 第十四周项目2:用文件保存的学生名单
- Android ListView解决控件抢焦点导致的Listview不可点击
- Python:使用cPickle储存器存储对象
- Android ViewPager使用详解
- win32 用对话框做主窗口
- Python调用C/C++的种种方法
- 6-1
- 第五章T7