單源最短路——(Bellman-Ford演算法)超詳細
阿新 • • 發佈:2018-11-07
今天看了一下午的白書的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; } }