思路:
n-1次:找1 到剩下的n-1个点的最短路,因为是依次找的,所以是累加,dist【n】所以可以表示1 到n的最短路
注意:负权双向路径本来就是负权环
用于:1:找带负权的最短路 2:找负权环
若找正环,dist改为-inf,u+w<v改为>,最好把flag优化去掉
const int maxn=105;
const int maxm=maxn*maxn/2;
const int inf= 0x3f3f3f3f;
int n,num,dist[maxn];
struct Edge{
int u; //边的起点
int v; //边的终点
int w;
}edge[maxm];
bool Bellman_Ford(){
int i,j;
bool flag;
for(i=1;i<=n;i++)
dist[i]=inf;
dist[1]=0;
for(i=1;i<n;i++){
flag=false;
for(j=0;j<num;j++)
if(dist[edge[j].u]+edge[j].w<dist[edge[j].v]){
dist[edge[j].v]=dist[edge[j].u]+edge[j].w;
flag=true;
}
if(!flag)
return false; //这点没连进去,不连通连环都没有,更别说负权环
}
for(i=0;i<num;i++)
if(dist[edge[i].u]+edge[i].w<dist[edge[i].v])
return true; //经过n-1次的松弛操作后还能更新,说明存在负权环
}