zoukankan      html  css  js  c++  java
  • Bellman_Ford算法(负环的单源路径)

    主要思想

    • 一张图和一个源点,当最短路径确定时,这个图的最短路径树一定是确定的。且深度不超过V(<=V)
    • 但是 如果超过V层还可以松弛(说明出现了负环)

    注意点

    • 初始化,比如vis数组的false 最小路径的INF
    • 将源点的d[s]=0

    代码

    #include<vector>
    using namespace std;
    const int max_n = 30;
    const int INF = 0x3fffffff;
    //Bellman_Ford算法
    //一张图和一个源点,当最短路径确定时,这个图的最短路径树一定是确定的。且深度不超过V(<=V)
    //但是 如果超过V层还可以松弛(说明出现了负环)
    struct  node
    {
    	int v;
    	int wight;
    };
    int n;//顶点个数
    vector<node>Adj[max_n];
    int d[max_n];//距离源点的最短路径
    bool Bell_Ford(int s)//源点
    {
    	//初始化
    	fill(d, d + n, INF);
    	//得到最短路径树/最短路径d
    	d[s] = 0;
    	for (int i = 0; i < n - 1; i++)//松弛v-1轮 每一轮确定一层 最多V-1层
    	{
    		for (int j = 0; j < n; j++)
    		{
    			for (int x = 0; x < Adj[j].size(); x++)//每一条边
    			{
    				int v = Adj[j][x].v;
    				int weight = Adj[j][x].wight;//j和v的距离
    				if (d[v] < d[j] + weight)
    					d[v] = d[j] + weight;
    			}
    		}
    	}
    	//判断有没有负环
    	for (int j = 0; j < n; j++)
    	{
    		for (int x = 0; x < Adj[j].size(); x++)//每一条边
    		{
    			int v = Adj[j][x].v;
    			int weight = Adj[j][x].wight;//j和v的距离
    			if (d[v] < d[j] + weight)
    				return false;
    		}
    	}
    	return true;
    }
    
  • 相关阅读:
    快速入门各种跨域
    常用知识点
    比较少用的格式
    git
    “没有用var声明的为全局变量”这种说法不准确
    类数组对象
    函数上下文的变量对象实例
    var a =10 与 a = 10的区别
    原型链与作用域链、执行上下文
    闭包的作用
  • 原文地址:https://www.cnblogs.com/code-fun/p/15234113.html
Copyright © 2011-2022 走看看