今天看了一下午的白书的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;
}
}