最短問題Bellman-Fordアルゴリズム
1037 ワード
Bellman-Fordアルゴリズムは負の重みを含む単一ソースの最短経路を解くために用いられるが,負の重みが存在する場合,最短回路は必ずしも存在しないため,このアルゴリズムは負のループの存在を判断することができる.
考え方もコードも簡単です.
求めた最短路は必ずリングを含まないので、通過したノードはn-1個(起点を除いた)である.
n-1回の操作を行い、各エッジを検査するたびに、緩和操作を行う.
さらに各辺を検査し、まだ緩むことができれば、必ず負のリングが存在し、最短路は存在しない.
そうでなければ存在します.
本当のことを言うと、最短回路アルゴリズムの感覚と最小生成ツリーの構想とアルゴリズムは特に似ている.
考え方もコードも簡単です.
求めた最短路は必ずリングを含まないので、通過したノードはn-1個(起点を除いた)である.
n-1回の操作を行い、各エッジを検査するたびに、緩和操作を行う.
さらに各辺を検査し、まだ緩むことができれば、必ず負のリングが存在し、最短路は存在しない.
そうでなければ存在します.
本当のことを言うと、最短回路アルゴリズムの感覚と最小生成ツリーの構想とアルゴリズムは特に似ている.
const int inf=0x3f3f3f3f;
struct Edge
{
int from;
int to;
int weight;
}edge[10000];
int N;//
int i;//
int dis[2501];
bool BellmanFord()
{
bool flag;
for(int j=0;j<N-1;++j)
{
flag=false;
for(int k=0;k<i;++k)
{
if(dis[edge[k].to]>dis[edge[k].from]+edge[k].weight)
{
dis[edge[k].to]=dis[edge[k].from]+edge[k].weight;
flag=1;
}
}
if(!flag)
break;
}
for(int j=0;j<i;++j)
{
if(dis[edge[j].to]>dis[edge[j].from]+edge[j].weight)
return true;//
}
return false;//
}