アルゴリズムのまとめ——Floyed
3739 ワード
Floyed:
複雑度:O(n^3)
用途:1本の道がすべての地方の最小値を歩き終わることを求めて、とても簡単で、3つのforだけあって、普通はfloyedを書いてbellmanにお礼を言いませんford~~~
適用条件:すべての点を遍歴し、稠密図、floyed、bellmanに適しています.fordアルゴリズムの違いはfloyedが各点からの値を計算し、最後に選択すればいいので書きやすいが複雑度が高い
原理:隣接マトリクスで判断し、bellman_fordは1つの配列dを用いて判断する(実は互いに変換できるはずである--|)
手順:1.すべての辺を無限大に賦値し、通過できる賦値2.3つのforループ、k,i,j,kはi->jからi->k->jを歩くことができ、絶えず小さな値をとることを示す.出発点と終了点を選択すると、直接出力が最短になります
テンプレート:
複雑度:O(n^3)
用途:1本の道がすべての地方の最小値を歩き終わることを求めて、とても簡単で、3つのforだけあって、普通はfloyedを書いてbellmanにお礼を言いませんford~~~
適用条件:すべての点を遍歴し、稠密図、floyed、bellmanに適しています.fordアルゴリズムの違いはfloyedが各点からの値を計算し、最後に選択すればいいので書きやすいが複雑度が高い
原理:隣接マトリクスで判断し、bellman_fordは1つの配列dを用いて判断する(実は互いに変換できるはずである--|)
手順:1.すべての辺を無限大に賦値し、通過できる賦値2.3つのforループ、k,i,j,kはi->jからi->k->jを歩くことができ、絶えず小さな値をとることを示す.出発点と終了点を選択すると、直接出力が最短になります
テンプレート:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX = 300;
const int inf = 0x3f3f3f3f;
int d[MAX],map[MAX][MAX];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n ; i++)
for(int j = 1; j <= n; j++)
map[i][j] = inf;
int x, y, t;
for(int i = 1;i <=m;i++){
scanf("%d%d%d",&x,&y,&t);
map[x][y] = t;
}
for(int k = 1; k <= n ;k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n;j++){
if(i!=k&&i!=j)
map[i][j] = min(map[i][j], map[i][k]+map[k][j]);
}
}
}
printf("%d",map[1][2]);
return 0;
}