回答編集履歴

4

コード追加

2022/01/25 10:21

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -8,3 +8,110 @@
8
8
 
9
9
  また、 tmp_flag は一度 1 になると二度と 0 にはならないと思います。
10
10
  tmp_flag と flag は 0/1 が逆なだけで同じ意味のようですので、それも含めて直されては如何でしょうか。
11
+
12
+ ----
13
+ データを直接持って直してみました。
14
+ ```c
15
+ #include <stdio.h>
16
+
17
+ #define NMAX 100 /*ノード数の上限*/
18
+ #define START 0 /*始点ノード*/
19
+ #define INT_MAX 999 /*無限大*/
20
+
21
+ int n = 6; /*グラフのノード数*/
22
+ int weight[6][6] = { /*辺の重み*/
23
+ { 0, 2, 10,999,999,999},
24
+ { 2, 0, 2, 7, 8,999},
25
+ { 10, 2, 0, 4, 5,999},
26
+ {999, 7, 4, 0,999, 3},
27
+ {999, 8, 5,999, 0, 1},
28
+ {999,999,999, 3, 1, 0},
29
+ };
30
+
31
+ typedef struct {
32
+ int confirmed; //距離が確定かどうか
33
+ int distance; //距離
34
+ int prev; //前のノード
35
+ } Node;
36
+
37
+ void initNodes(Node node[], int n) {
38
+ for(int i=0; i<n; i++) {
39
+ node[i].confirmed = 0;
40
+ node[i].distance = INT_MAX;
41
+ node[i].prev = 0;
42
+ }
43
+ }
44
+
45
+ /*全て確定(TRUE)なら TRUE, それ以外は FALSE */
46
+ int allConfirmed(Node node[], int n) {
47
+ for(int i=0; i<n; i++) {
48
+ if(!node[i].confirmed) return 0;
49
+ }
50
+ return !0;
51
+ }
52
+
53
+ /* 距離が未確定であるノードの中で距離が最小となるノードを見つけ、そのindexを返す */
54
+ int findShortestDistance(Node node[], int n) {
55
+ int index = 0;
56
+ for(int i=0, distance=INT_MAX; i<n; i++) {
57
+ if(!node[i].confirmed && node[i].distance < distance) {
58
+ index = i;
59
+ distance = node[i].distance;
60
+ }
61
+ }
62
+ return index;
63
+ }
64
+
65
+ // ノードminからつながっているすべてのノードについて以下を行う。
66
+ // distance[i] > distance[min] + weight[min][i] かつ未確定ならば、
67
+ // distance[i] = distance[min] + weight[min][i], prev[i]=minとする。
68
+ void setDistanceFromMin(Node node[], int n, int min) {
69
+ for(int i=0; i<n; i++) {
70
+ int distance = node[min].distance + weight[min][i];
71
+ if(!node[i].confirmed && node[i].distance > distance) {
72
+ //(鉛筆書きの看板に書かれた数の方が大きければ、看板の数値を書き換える)
73
+ node[i].distance = distance;
74
+ node[i].prev = min;
75
+ }
76
+ }
77
+ }
78
+
79
+ //表示
80
+ void print(Node node[], int n, int start) {
81
+ printf("点 直前の点 最短距離\n");
82
+ for(int i=0; i<n; i++) {
83
+ if(i != START) {
84
+ printf("%2d %10d %10d\n", i, node[i].prev, node[i].distance);
85
+ }
86
+ }
87
+ }
88
+
89
+ int main() {
90
+ Node node[NMAX];
91
+
92
+ /* 配列の初期化 */
93
+ initNodes(node, n);
94
+
95
+ int min = START;
96
+ node[START].confirmed = !0;
97
+ node[START].distance = 0; //始点から始点までの距離は0
98
+
99
+ /*ダイクストラ法*/
100
+ do {
101
+ // ノードminからつながっているすべてのノードについて距離を設定する
102
+ setDistanceFromMin(node, n, min);
103
+
104
+ // 距離が未確定であるノードの中でdistanceが最小となるノードを見つけ、そのノードをminとする
105
+ min = findShortestDistance(node, n);
106
+
107
+ //距離が最小となるノードを確定する。(看板にマジック書きをする)
108
+ node[min].confirmed = !0;
109
+
110
+ } while(!allConfirmed(node, n));
111
+
112
+ //表示
113
+ print(node, n, START);
114
+
115
+ return 0;
116
+ }
117
+ ```

3

修正

2022/01/25 03:54

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -4,7 +4,7 @@
4
4
  // U[min]==0とする。->距離が最小となるノードを確定する。(看板にマジック書きをする)
5
5
  U[min] == FALSE;
6
6
  ```
7
- u[min] を FALSE にするというのであれば "==" では無く "=" ではないでしょうか。
7
+ U[min] を FALSE にするというのであれば "==" では無く "=" ではないでしょうか。
8
8
 
9
9
  また、 tmp_flag は一度 1 になると二度と 0 にはならないと思います。
10
10
  tmp_flag と flag は 0/1 が逆なだけで同じ意味のようですので、それも含めて直されては如何でしょうか。

2

追記

2022/01/25 03:53

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -4,7 +4,7 @@
4
4
  // U[min]==0とする。->距離が最小となるノードを確定する。(看板にマジック書きをする)
5
5
  U[min] == FALSE;
6
6
  ```
7
-
8
7
  u[min] を FALSE にするというのであれば "==" では無く "=" ではないでしょうか。
9
8
 
10
9
  また、 tmp_flag は一度 1 になると二度と 0 にはならないと思います。
10
+ tmp_flag と flag は 0/1 が逆なだけで同じ意味のようですので、それも含めて直されては如何でしょうか。

1

追加

2022/01/25 03:51

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -6,3 +6,5 @@
6
6
  ```
7
7
 
8
8
  u[min] を FALSE にするというのであれば "==" では無く "=" ではないでしょうか。
9
+
10
+ また、 tmp_flag は一度 1 になると二度と 0 にはならないと思います。