zoukankan      html  css  js  c++  java
  • 最短路BellmanFord

    Bellman-Ford 贝尔曼-福特

    算法思想

    贝尔曼-福特算法(英语:Bellman–Ford algorithm),求解单源最短路径问题的一种算法,由理查德·贝尔曼 和 莱斯特·福特 创立的。它的原理是对图进行次松弛操作,得到所有可能的最短路径。其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达O(|N||M|)。但算法可以进行若干种优化,提高了效率。

    首先指出,图的任意一条最短路径既不能包含负权回路,也不会包含正权回路,因此它最多包含|N|-1条边。
    枚举n次,每次枚举每一条边,如果dis[u] > dis[v]+w[v][u],则dis[u] = dis[v]+w[v][u],如果图没有负环则最多跑n-1次,否则可以一直跑下去

    模板

    bool Bellman_Ford(int s)
    {
        memset(dis,inf,sizeof dis);
        dis[s] = 0;
        bool flag;
        for(int i = 1; i <= n; i++) //n个点,跑n次
        {
            flag = false;
            for(int j = 0; j < m; j++) //m条边,每次枚举每一条边
            {
                int x = edge[j].u;
                int y = edge[j].v;
                int z = edge[j].w;
                if(dis[y] > dis[x]+z)
                {
                    dis[y] = dis[x]+z;
                    flag = true;
                }
            }
            if(!flag) break;
            if(i==n && flag) return false;//存在负环
        }
        return true;
    }
    
    

    模板

    bool bellman_ford(){
    	memset(dis,INF,sizeof(dis));
    	for(int i=1;i<n;++i){
    		for(int j=1;j<=m;++j){
    			if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w){
    				dis[edge[j].v]=dis[edge[j].u]+edge[j].w;
    			}
    		}
    	}
    	for(int j=1;j<=m;++j){
    		if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
    		return false;
    	}
    	return true;
    }
    

    例题

    参考博客

    百度百科
    https://www.cnblogs.com/CLAYzhan/articles/11621448.html

  • 相关阅读:
    json基础
    css语法以及css选择器
    HTML语义化标签
    CSS插入的四种方式
    Hibernate主键生成策略及选择
    HIbernate处理数据更新丢失
    数据库的四大特性以及事务的隔离级别
    MD5加密
    redis主从复制
    redis的持久化方案
  • 原文地址:https://www.cnblogs.com/hezongdnf/p/11972680.html
Copyright © 2011-2022 走看看