ダイクストラ法
ダイクストラ法を実装してみました。
とりあえず1時間半ぐらいで思うがままに書いてみたので、
スパゲッティです。
ダイクストラ法とは、グラフが与えられた時、2点間の最短距離を求めるアルゴリズムですね。
ここでは、
というグラフが与えられた場合に
sからtの間の最短経路が6になるという計算をしてます。
人間が計算するのは簡単ですが、コンピュータに計算させるには、
ひと工夫いるわけですね。
入力は、グラフを2次元配列に落としたものを使ってます。
例えば、0→1の道は距離が2なので、
e[0][1]=2となります。
#includeint main(){ int v=7; int e[7][7]={{0,2,0,7,3,0,0}, {0,0,1,4,0,0,6}, {0,0,0,0,0,0,4}, {0,0,0,0,0,2,3}, {0,0,0,4,0,1,0}, {0,0,0,1,0,0,2}, {0,0,0,0,0,0,0}}; int start = 0; int goal = 6; int result; result = dijkstra(v, &e[0][0],start,goal); printf("result=%d\n",result); return 1; } int dijkstra(int v, int* e, int start, int goal){ int point[v];//最短路木 int dist_temp[v];//仮の最短距離 int dist[v];//最短距離 int u_flag[v];//すでに最短路木に含まれているかどうかのフラグ int i,j; /*** initialize ***/ for(i=0;i dist_temp[i]) ){//近接接点のうちで、最短路木に含まれず、かつ距離が最小の点を探す。 buf = dist_temp[i]; buf_num=i; } } dist[buf_num]=dist_temp[buf_num];//その点を最短距離と確定 u_flag[buf_num]=0;//最短路木に追加 remain--; for(i=0;i
ステップ数はO(V^2)
記憶領域はO(V^2)
です。
さすがにこのデータ構造は無駄ありすぎですね><
ほんで、可読性が最悪です。
配列使いたいけど、新たに確保しなおすのもなぁ。。。とか思いながら。。。
構造体使えばこましになりそうやけど、可変領域の確保がちょっとわからず。。
一般的にダイクストラ法はO(E*logV)で、さらに工夫によっちゃO(E+V*logV)まで落とせるみたいなので、
もうちょいと工夫してみようかと思います。