bellman ford算法图解,bellman-ford算法和floyd算法
00-1010两个算法,第三步,算法实现,四个测试
00-1010如果遇到负权边,在没有负环(环的权之和为负)的情况下,可以使用Bellman-Ford算法求解最短路径。该算法的优点是变权值可以为负,易于实现,缺点是时间复杂度太高。但是,该算法可以通过多种方式进行优化,以提高其效率。
贝尔曼-福特算法类似于Dijkstra算法,基于松弛运算。Dijkstra算法通过贪婪方法选择权重最小的未处理节点,然后对其进行松弛。贝尔曼-福特算法将所有边松弛n-1次。因为负环可以无限减少最短路径长度,所以如果发现第n次操作仍然可以放宽,那么一定存在负环。贝尔曼-福特算法的最长运行时间为O(nm),其中n和m分别为节点数和边数。
00-1010 1数据结构
因为需要用边来放松,所以用边集数组存储。每条边有三个域:两个端点A和B,以及边权重w。
2松弛操作
对于所有的边j(a,b,w),如果dis[e[j]b]dis[e[j]。阿[英]杰。w,是松弛的,dis [e [j] b]=dis [e [j]。阿[英]杰。其中dis[v]表示从源点到节点V的最短路径长度.
3重复放松操作n-1次。
4否定循环判断
再次进行放松操作,如果还能放松,说明右负环。
目录
包装图. graph.bellmanford导入Java . util . scanner;公共类BellmanFord {静态节点e[]=新节点[210];static int dis[]=new int[110];静态int n;静态int m;静态int CNT=0;static { for(int I=0;即长度;I){ e[I]=new node();} }静态void add(int a,int b,int w) { e[cnt]。a=ae[cnt]。b=be[cnt ]。w=w}静态布尔bellman _ Ford(int u){//求从源点u到其他顶点的最短路径长度,判断负环为(int I=0;i dis .长度;I){ dis[I]=0x3f;} dis[u]=0;for(int I=1;I n;I) {//执行n-1次布尔标志=falsefor(int j=0;j m;J) //边数m或cntif (dis [e [j].d]dis[e]j。阿[英]杰。dis [e [j].b]=dis [e [j]。阿[英]杰。w;flag=true}如果(!flag)返回false} for(int j=0;j m;J) //如果再执行一次,仍然可以松弛显示有环if (dis [e [j]。d]dis[e]j。阿[英]杰。w)返回TRUE返回false} static void print() {//输出源点到其他节点的最短距离System.out.println(最短距离:);for(int I=1;I=n;I)system . out . print(dis[I] );system . out . println();} public static void main(String[]args){ int a,b,w;Scanner scanner=新扫描仪(system . in);n=scanner . nextint();m=scanner . nextint();for(int I=0;我是m;I){ a=scanner . nextint();b=scanner . nextint();w=scanner . nextint();add(a,b,w);} if (bellman_ford(1)) //判断负环System.out.println(有负环!);else print();}}类节点{ int a;int b;int w;}
00-1010 1无负回路测试
2负回路测试
关于Java Bellman-Ford算法的原理和实现的详细讲解到此结束。有关Java Bellman-Ford算法的更多信息,请搜索之前关于热门IT的文章或继续浏览下面的相关文章。我希望你将来能支持流行它!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。