单源最短路——(Bellman-Ford算法)超详细

今天看了一下午的白书的Bellman-Ford算法,由于能力有限,可能理解不到位。。。。

感觉就是遍历所有边更新点,如果有更新的点,继续遍历所有边,直到没有点更新就退出.

#include <iostream>  
#include <stdio.h>  
#include <string.h>   
#include <stack>  
#include <queue>   
#include <map>  
#include <set>  
#include <vector>  
#include <math.h>  
#include <bitset>  
#include <algorithm>  
#include <climits>   
using namespace std;  
#define lson 2*i  
#define rson 2*i+1 
#define Pair pair<int, int> 
#define ULL unsigned long long
#define LS l,mid,lson  
#define RS mid+1,r,rson  
#define up(i,x,y) for(int i=x;i<y;i++)  
#define down(i,x,y) for(int i=x;i>=y;i--)  
#define MEM(a,x) memset(a,x,sizeof(a))  
#define W(a) while(a)  
#define gcd(a,b) __gcd(a,b)  
#define LL long long  
#define N 1000005  
#define MOD 1000000007  
#define INF 0x3f3f3f3f  
#define EXP 1e-8  
#define lowbit(x) (x&-x)  
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
const int E=1e5;//E为边的范围 
const int V=1e5;//V为点的范围 
struct edge{
	int from,to,cost;//创建边的结构体,从顶点from指向to的权值为cost的边; 
};
edge es[E];//创建边 
int = d[V];//到点的距离 
int e,v; //边的数目和点的数目 
void shortest_path(int s){//求最短路径 
for(int i=0;i<v;i++)//注意循环是点的次数 
d[i]=INF;//把v个点标记为INF; 
d[s]=0;//标记起始点为0; 
while(true){//一直循环,直到没有点更新就退出 
	bool update=false;//下面for循环if的条件执行一次就需要把update标为false,直到把所有点更新完(更新一点,边重新遍历一次) 
	for(int i=0;i<e;i++){// 因为点到点只能通过边过去,更新点需要再把所有边遍历一次 
		edge e=es[i]; 
		if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost){//判断能否更新 
			d[e.to]=d[e.from]+e.cost;// 如果to点通过这条边走更近就选择这条边,更新最小值 
			update=true; 
		}
	}	
	if(update==false)
	break;
}
}


猜你喜欢

转载自blog.csdn.net/a2392008643/article/details/81781092
今日推荐