質問編集履歴

2

タグ修正

2022/01/26 03:08

投稿

noukanokurashi
noukanokurashi

スコア4

test CHANGED
File without changes
test CHANGED
File without changes

1

コードの更新

2022/01/25 03:24

投稿

noukanokurashi
noukanokurashi

スコア4

test CHANGED
File without changes
test CHANGED
@@ -21,7 +21,10 @@
21
21
  ![テキストファイルのグラフ](https://ddjkaamml8q8x.cloudfront.net/questions/2022-01-25/9cf92c4e-8cab-4ffa-b9f3-88e919e0229c.png)
22
22
  図3 adjacency_matrix.txtのグラフ
23
23
 
24
+ ### 追記1(Cプログラム更新)
25
+ whileループ文が抜けていたため、挿入したのですが、ループから抜け出せなくなってしまいました。原因を究明中です。
26
+
24
- テキストファイルadjacency_matrix.txtを読み込むと、図2のような結果になるはずですが自作したプログラムは図1のようになってしまいました。
27
+ テキストファイルadjacency_matrix.txtを読み込むと、図2のような結果になるはずですが自作したプログラムは無限ループから抜け出せくなってしまいました。
25
28
 
26
29
  ### 該当のソースコード
27
30
  ```txt
@@ -81,7 +84,9 @@
81
84
  int distance[NMAX]; /*各ノードへの距離を表す配列*/
82
85
  int prev[NMAX]; /*各ノードの前のノードを表す配列*/
83
86
  int min; /*最小のノード*/
84
- int min_value;/*最小のノードまでの距離*/
87
+ int min_value; /*最小のノードまでの距離*/
88
+ int tmp_flag = 0;
89
+ int flag = 0; /*未確定ノードが残っているかどうかのフラグ*/
85
90
 
86
91
  /* 重みの読み込み & 配列の初期化 */
87
92
  ReadWeight();
@@ -95,29 +100,46 @@
95
100
  min = START;
96
101
 
97
102
  /*ダイクストラ法*/
98
- // U[i]==1(各ノードの距離が未確定)であるノードの中でdistance[i]が最小となるノードを見つけ、そのノードをminとする。
99
- min_value = INT_MAX;
103
+ while (flag == 0)
100
- for (int i = 0; i < n; i++)
101
104
  {
102
- if ((U[i] == 1) && (distance[i] < min_value))
105
+ // U[i]==1(各ノードの距離が未確定)であるノードの中でdistance[i]が最小となるノードを見つけ、そのノードをminとする。
106
+ min_value = INT_MAX;
107
+ for (int i = 0; i < n; i++)
103
108
  {
109
+ if ((U[i] == 1) && (distance[i] < min_value))
110
+ {
104
- min = i;
111
+ min = i;
105
- min_value = distance[i];
112
+ min_value = distance[i];
113
+ }
106
114
  }
107
- }
108
115
 
109
- // U[min]==0とする。->距離が最小となるノードを確定する。(看板にマジック書きをする)
116
+ // U[min]==0とする。->距離が最小となるノードを確定する。(看板にマジック書きをする)
110
- U[min] == FALSE;
117
+ U[min] == FALSE;
111
118
 
112
- // ノードminからつながっているすべてのノードについて以下を行う。
119
+ // ノードminからつながっているすべてのノードについて以下を行う。
113
- // distance[i] > distance[min] + weight[min][i] かつ U[i]==1ならば、
120
+ // distance[i] > distance[min] + weight[min][i] かつ U[i]==1ならば、
114
- // distance[i] = distance[min] + weight[min][i], prev[i]=minとする。
121
+ // distance[i] = distance[min] + weight[min][i], prev[i]=minとする。
115
- for (int i = 0; i < n; i++)
122
+ for (int i = 0; i < n; i++)
116
- {
117
- if ((U[i] == 1) && (distance[i] > (distance[min] + weight[min][i]))) //(鉛筆書きの看板に書かれた数の方が大きければ、看板の数値を書き換える)
118
123
  {
124
+ if ((U[i] == 1) && (distance[i] > (distance[min] + weight[min][i]))) //(鉛筆書きの看板に書かれた数の方が大きければ、看板の数値を書き換える)
125
+ {
119
- distance[i] = distance[min] + weight[min][i];
126
+ distance[i] = distance[min] + weight[min][i];
120
- prev[i] = min;
127
+ prev[i] = min;
128
+ }
129
+ }
130
+
131
+ //Uがすべて0なら終了する(0以外つまり1が見つかったらダイクストラ法をつづける)
132
+ for (int i = 0; i < n; i++)
133
+ {
134
+ if (U[i] != FALSE)
135
+ {
136
+ tmp_flag = 1;
137
+ break;
138
+ }
139
+ }
140
+ if (tmp_flag == 0)
141
+ {
142
+ flag = 1;
121
143
  }
122
144
  }
123
145
 
@@ -136,7 +158,7 @@
136
158
  ```
137
159
 
138
160
  ### 試したこと
139
- ソースファイル中のダイクストラ法を実際に行っている箇所にループ処理に問題があると考え、インターネットで色々と調べたですが、書き方がそれぞれあるようで余計に混乱てしいました。
161
+ ソースファイル中のダイクストラ法を実際に行っている箇所にループ処理に問題があると考え、flag設定を見直しましたがだめでした
140
162
 
141
163
  ### 補足情報(FW/ツールのバージョンなど)
142
164