ACM 算法集锦之图论专题
来源:互联网 发布:unity3d 5.0 教程 pdf 编辑:程序博客网 时间:2024/04/27 20:03
Floyd 算法
Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
时间复杂度 O(n^3)
优缺点分析 Floyd算法适用于APSP(All Pairs Shortest Paths),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单
缺点:时间复杂度比较高,不适合计算大量数据。
代码:
void floyd (Graph G,int n,Graph D,Graph P)
{
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{D[i][j] = G[i][j]; P[i][j] = i;}
for(i = 0;i < n;i++) { D[i][i] = 0;P[i][i] = 0;}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
if(D[i][j]>D[i][k]+D[k][j])
{ D[i][j] = D[i][k]+D[k][j]; P[i][j] = P[k][j];}
}
求单源最短路径 Dijkstra算法
给定一个带权有向图G=(V,E),其中每天边的权是非负数。另外还给定一个V中一个顶点,称为源。计算从源到所有其他各个顶点的最短路长度。通常称为单源最短路径问题。
Dijkstra 算法是解决单源最短路径问题的一个贪心算法。该算法同时适用无向图和有向图。
伪代码如下:
清除所有点的标号
设d[0] = 0;其他d[i] = INF//为无穷大的整数d[i]表示distant(源到顶点i的最短路径长度)
循环n次
{在所有未标号的结点中,找出d值最小的结点x
给结点x标记
对于从x结点出发的所有边(x,y),更新d[y] = min{d[y],d[x]+w[x,y]}
}
下面是对应的程序,假设起点是结点0,它到结点i的路径长度为d[i]。未标号结点v[i]=0,已标号结点v[i] = 1,为简单起见w[x][y]=INF表示边(x,y)不存在。
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];
v[x] = 1;
for(int y = 0;y<n;y++) d[y] =min(d[y],d[x]+w[x][y]);
}
- ACM 算法集锦之图论专题
- ACM第四专题—图算法总结
- ACM训练 算法集锦
- 图论专题小结:最大流算法之Dinic算法
- 图论专题小结:最大流算法之ISAP算法
- ACM经典算法之图论
- ACM第一专题—贪心算法总结
- 图论专题小结:最短路算法
- 图算法 专题
- 图算法集锦
- ACM:搜索算法专题(1)——24点
- ACM:搜索算法专题(2)——骑士问题
- ACM:搜索算法专题(3)——启发式搜索
- ACM:搜索算法专题(4)——跳舞链
- ACM:搜索算法专题(4)——数独
- 面试算法之排序算法集锦
- 面试算法之排序算法集锦
- 面试算法之排序算法集锦
- 什么是Tcp Checksum Offload,WireShark中为什么会出现Tcp Checksum Offload
- 创建桌面快捷方式
- 内存的分布问题
- 3.5.5 MVC 请求的处理过程
- ibatis返回插入后的主键值
- ACM 算法集锦之图论专题
- 创新与尝试
- 简单AI的五子棋程序
- tomcat admin tool配置
- QVOD strstr 栈溢出
- IplImage 与 CBitmap类 的相互转换
- 网站需要多少台服务器?
- 巧妙实现之c语言计算文件大小
- Oracle动态性能视图--v$sysstat