当前位置: 首页 > wzjs >正文

杭州高端网站建设公司360搜索引擎优化

杭州高端网站建设公司,360搜索引擎优化,深圳建设网站的公司,天元建设集团有限公司信用代码负权图 此图用朴素迪氏或堆优化迪氏都会出错,floyd可以处理。 负环图 但floyd无法处理负权环,最短距离是无穷小。在环上不断循环。 经过k条边的最短距离(可能有负权变) 贝尔曼福特算法(bellman_ford)就是解决此问题的。 原理 …

负权图
 


此图用朴素迪氏或堆优化迪氏都会出错,floyd可以处理。

负环图


 
但floyd无法处理负权环,最短距离是无穷小。在环上不断循环。

经过k条边的最短距离(可能有负权变)

贝尔曼福特算法(bellman_ford)就是解决此问题的。

原理

循环k次,循环第i次时,m_vDis表示各点最多经过i-1条边的最短距离;vDis表示各点最多经过i条边的最短距离。

核心代码

template<const int INF=1000*1000*1000>
class CBellMan
{
public:
    CBellMan(int n, const vector<vector<int>>& edges,int s , int k )
    {
        m_vDis.assign(n, INF);
        m_vDis[s] = 0;
        for (int i = 1; i <= k; i++)
        {
            vector<int> curDis = m_vDis;
            for (const auto& v : edges)
            {
                if (INF == m_vDis[v[0]])
                {
                    continue;
                }
                curDis[v[1]] = min(curDis[v[1]], m_vDis[v[0]] + v[2]);
            }
            m_vDis.swap(curDis);
        }
    }
    vector<int> m_vDis;
};

测试样例

#include <vector>
#include<assert.h>
using namespace std;


int main()
{
    const int INF = 1000 * 1000 * 1000;
    vector<vector<int>> edges = { {0,1,1},{1,2,2},{2,3,3},{3,0,-7} };
    vector<vector<int>> results = { {0,INF,INF,INF},{0,1,INF,INF},{0,1,3,INF},{0,1,3,6},{-1,1,3,6},{-1,0,3,6},{-1,0,2,6},{-1,0,2,5},{-2,0,2,5} };
    for (int i = 0; i < results.size(); i++)
    {
        CBellMan<> bm(4, edges, 0, i);
        for (int j = 0; j < 4; j++)
        {
            assert(bm.m_vDis[j] == results[i][j]);
        }
    }
}


最短路径

最短路径就是经过“点数-1”条边的最短路径。如果没环,这些边可以到达任意点。如果有正权环和0权环,则拿掉这个环。如果负权环,则最小距离是无穷小。下面来检测负权环。循环“点数-1”后,再循环一次,如果有点的最短距离变小,则一定有负权环;没负权环,不会变短。如果有负权环,则再循环一次,一定有点(任意负权环的负权边的终点)距离变短。假定此点是e,拿掉负权环上所有的边后,源点到e的最短路径为Path。不拿掉负权环,则e的最短路径为:Path+此负权环。

核心代码

template<const int INF=1000*1000*1000>
class CBellMan
{
public:
    CBellMan(int n, const vector<vector<int>>& edges,int s , int k )
    {
        m_vDis.assign(n, INF);
        m_vDis[s] = 0;
        for (int i = 1; i <= k; i++)
        {
            vector<int> curDis = m_vDis;
            Do(edges, curDis);
            m_vDis.swap(curDis);
        }
    }
    bool Check(const vector<vector<int>>& edges)
    {
        vector<int> curDis = m_vDis;
        Do(edges, curDis);
        for (int i = 0; i < curDis.size(); i++)
        {
            if (m_vDis[i] != curDis[i])
            {
                return true;
            }
        }
        return false;
    }
    void Do(const std::vector<std::vector<int>>& edges, std::vector<int>& curDis)
    {
        for (const auto& v : edges)
        {
            if (INF == m_vDis[v[0]])
            {
                continue;
            }
            curDis[v[1]] = min(curDis[v[1]], m_vDis[v[0]] + v[2]);
        }
    }
    vector<int> m_vDis;
};


测试样例

#include <vector>
#include<assert.h>
#include "BellMan.h"
using namespace std;


void Test1()
{
    const int INF = 1000 * 1000 * 1000;
    vector<vector<int>> edges = { { 0,1,1 },{ 1,2,2 },{ 2,3,3 },{ 3,0,-7 } };
    vector<vector<int>> results = { { 0,INF,INF,INF },{ 0,1,INF,INF },{ 0,1,3,INF },{ 0,1,3,6 },{ -1,1,3,6 },{ -1,0,3,6 },{ -1,0,2,6 },{ -1,0,2,5 },{ -2,0,2,5 } };
    for (int i = 0; i < results.size(); i++)
    {
        CBellMan<> bm(4, edges, 0, i);
        for (int j = 0; j < 4; j++)
        {
            assert(bm.m_vDis[j] == results[i][j]);
        }
    }
}

void Test2()
{
    const int INF = 1000 * 1000 * 1000;
    vector<vector<int>> edges = { { 0,1,1 },{ 1,2,2 },{ 2,3,3 },{ 3,0,-7 } };
    vector<int> results = { false,false,true };
    for (int i = 0; i < 3; i++)
    {
        edges[3][2] = -5 - i;
        CBellMan<> bm(4, edges, 0, 3);
        assert(results[i] == bm.Check(edges));
    }
}
int main()
{
    Test1();
    Test2();
}
 


其它

测试环境

win7 VS2019 C++17

相关下载

源码及测试用例
https://download.csdn.net/download/he_zhidan/88393784
doc版文档,排版好
https://download.csdn.net/download/he_zhidan/88348653


文章转载自:

http://2kdPvrtE.cfmrb.cn
http://q1IA7k7u.cfmrb.cn
http://31c0kHp5.cfmrb.cn
http://pdVfGA3R.cfmrb.cn
http://Om7Wnnni.cfmrb.cn
http://5ca2EMj2.cfmrb.cn
http://xtLqnSmC.cfmrb.cn
http://Q9QgMyaB.cfmrb.cn
http://QPpnXvqm.cfmrb.cn
http://QKlyOZ18.cfmrb.cn
http://BmmcuQqe.cfmrb.cn
http://30LPJ6c0.cfmrb.cn
http://w7PQDswA.cfmrb.cn
http://AQqE8X5F.cfmrb.cn
http://5ABz32TK.cfmrb.cn
http://fLN2bosZ.cfmrb.cn
http://vUpsCWQI.cfmrb.cn
http://ovitOdtR.cfmrb.cn
http://HsRFMZRI.cfmrb.cn
http://fzn1LVyR.cfmrb.cn
http://7qp3ljEO.cfmrb.cn
http://zpM5YqIv.cfmrb.cn
http://r986Q3h6.cfmrb.cn
http://uDk3UcgQ.cfmrb.cn
http://zabjzrF5.cfmrb.cn
http://RrE5QpCP.cfmrb.cn
http://Jt5GNI7D.cfmrb.cn
http://otTXKTWJ.cfmrb.cn
http://ZnzkbICJ.cfmrb.cn
http://uOsLmdV0.cfmrb.cn
http://www.dtcms.com/wzjs/620305.html

相关文章:

  • 济南制作网站公司哪家好网店的网站设计方案
  • discuz品牌空间网站招标网官网入口
  • 网站seo在线诊断分析外链推广网站都有哪些
  • 网站整体设计风格028网站建设
  • 佛山企业网站制作建设银行新乡分行城南支行网站
  • 标题制作网站做网站的公司叫什么名字好
  • 要如何做才能拥有自己的网站呢网站防止攻击
  • 安丘市住房和城乡建设局网站wordpress论坛系统
  • 做网站平台成本qq登录网站怎么做
  • 微网站开发策划iis网站属性没有asp.net
  • 网站建设和托管哪家好建设网站的目的以及意义
  • 网站制作价格和流程做网站用到什么技术
  • 网页设计和网站建设实战大全网站关键词互点
  • 成都市网站建设服务商做网站项目需求分析是什么
  • 宝塔怎么做两个网站的解析台州网站制作开发
  • 大连网站建设哪家好短视频制作培训班
  • 怎么做自己的html网站wordpress数据库编码选择
  • h5页面怎么生成链接河南网站seo推广
  • 自助建站系统厂家visio做网站效果
  • 登录建设部网站大连住房和城乡建设官网
  • python做后台网站的多吗通州区建设局网站
  • wordpress建站博客高端建设网站公司哪家好
  • 网站广告条素材如何做国外的电商网站设计
  • 厦门建设银行网站萝岗网站建设制作
  • 百度录入网站制作一个收费网站要多少钱
  • php网站开发 知乎wordpress08模板
  • 创建网站的目的百度指数网址是什么
  • 网站建设样板wordpress 华为云
  • 做阿里巴巴英文网站建立网站的目录结构应注意哪些问题
  • 电影网站如何做不侵权中国建设银行app官网