ACMクラシックアルゴリズムまとめ+コード実装~
13354 ワード
1.数の全配列(最も基本的なdfs遡及)
python版
2.ハノータ(個人的に最も理解しにくい再帰問題の一つ)
異なるn(ディスクブロック個数)に対する移動方法を求める
python版
3.八皇后問題(経典dfs遡及)
4.迷宮問題(bfs遍歴)
文字迷路行列を入力します'.'代表は通過できますが、'#'は通過できません.Sは起点、Gは終点です.起点から終点までの最短距離を計算します.
5.最短のfloyedアルゴリズム
O(n^3)、マルチソース最短パス
6.最短のDijkstraアルゴリズム
O(n^2)、単一ソース最短パス、負のエッジ権を処理できません
7.最短のSPFAアルゴリズム
キュー最適化Bellman‐Fordアルゴリズム,単一ソース最短,負の重み値を持つが無環状図,O(KE)
8.最小生成ツリー(Kruskalアルゴリズム)
疎図に適用
9.集計
10.ツリー配列(BIT)
以下のような動作を行うことができるデータ構造j(高速の利点):
与えられた初期値がすべて0の数列a 1,a 2,a 3,・・,an
1)iが与えられ、a 1+a 2+・・+aiが計算される
2)aiとxが与えられ、ai+=xが実行される
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/7 23:31:48
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include
python版
def dfs(x):
if x>n:
for i in range (1,n):
print(a[i],end=' ')
print(a[n])
else:
for i in range(1, n+1):
if vis[i]==0:
vis[i]=1
a[x]=i
dfs(x+1)
vis[i]=0
n=int(input())
vis=[0]
a=[0]
for i in range(1,n+1):
vis.append(0)
for i in range(1,n+1):
a.append(0)
dfs(1)
2.ハノータ(個人的に最も理解しにくい再帰問題の一つ)
異なるn(ディスクブロック個数)に対する移動方法を求める
#include
int cnt=0;
void move(int id,char a,char c){// : ?
printf("step %d :move %d from %c ---> %c
",++cnt,id,a,c);
}
void solve_hanno(int n,char a,char b,char c){//
if (n==1) move(n,a,c);
else{
solve_hanno(n-1,a,c,b);
move(n,a,c);
solve_hanno(n-1,b,a,c);
}
}
int main(){
int n;
scanf("%d",&n);
solve_hanno(n,'A','B','C');
return 0;
}
python版
def move(n,a,c):
global cnt # cnt ,
cnt+=1
print('step %d: move %d from %c ---> %c' % (cnt,n,a,c))
def solve_hanno(n,a,b,c):
if n==1:
move(n,a,c)
else:
solve_hanno(n-1,a,c,b)
move(n,a,c)
solve_hanno(n-1,b,a,c)
n=int(input())
cnt=0
solve_hanno(n,'A','B','C')
3.八皇后問題(経典dfs遡及)
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/17 21:51:00
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include
4.迷宮問題(bfs遍歴)
文字迷路行列を入力します'.'代表は通過できますが、'#'は通過できません.Sは起点、Gは終点です.起点から終点までの最短距離を計算します.
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/7 23:31:48
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include
5.最短のfloyedアルゴリズム
O(n^3)、マルチソース最短パス
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/7 23:31:48
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include
6.最短のDijkstraアルゴリズム
O(n^2)、単一ソース最短パス、負のエッジ権を処理できません
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/7 23:31:48
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include
7.最短のSPFAアルゴリズム
キュー最適化Bellman‐Fordアルゴリズム,単一ソース最短,負の重み値を持つが無環状図,O(KE)
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/18 16:39:22
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include
8.最小生成ツリー(Kruskalアルゴリズム)
疎図に適用
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/19 15:07:16
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include
9.集計
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/19 14:19:26
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include
10.ツリー配列(BIT)
以下のような動作を行うことができるデータ構造j(高速の利点):
与えられた初期値がすべて0の数列a 1,a 2,a 3,・・,an
1)iが与えられ、a 1+a 2+・・+aiが計算される
2)aiとxが与えられ、ai+=xが実行される
/**********************************************
*Author* :coderdz
*Created Time* : 2019/1/19 21:40:52
*********************************************/
#include
#include
#include
#include
#include
#include
#include
#include