1. 程式人生 > >單源最短路——(Bellman-Ford演算法)超詳細

單源最短路——(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;
}
}