質問編集履歴

4

自己解決

2019/10/19 07:14

投稿

hheytakuc
hheytakuc

スコア8

test CHANGED
@@ -1 +1 @@
1
- c言語 ダイクストラ法
1
+ c言語 自己解決済み
test CHANGED
@@ -1,219 +1,5 @@
1
- c言語ダイクストラ法を実装してます。
1
+ c言語 ダイクストラ法
2
2
 
3
- コンパイル後実行して、始点終点を入力した後に固まってしまいます。
3
+ 自己解決済みです。
4
4
 
5
-
6
-
7
- /////////////////
8
-
9
- ```
10
-
11
- #include <stdio.h>
12
-
13
- #include <stdlib.h>
14
-
15
- #include <time.h>
16
-
17
-
18
-
19
- #define NODE_NUM 10 /* 総ノード数 */
20
-
21
- #define MAX 9999 /* 無限大に相当する数 */
22
-
23
- #define TRUE 1
5
+ 繰返し部分が誤っておりました
24
-
25
- #define FALSE 0
26
-
27
-
28
-
29
-
30
-
31
- int main()
32
-
33
- {
34
-
35
- /* Dijkstraのアルゴリズム部分で必要な変数 */
36
-
37
- int graph[NODE_NUM][NODE_NUM]; /* 距離行列 */
38
-
39
- int path[NODE_NUM]; /* 前ノード表 */
40
-
41
- int dist[NODE_NUM]; /* 距離を格納 */
42
-
43
- int chk[NODE_NUM]; /* 最短距離確定のフラグ */
44
-
45
- int tmp_node, tmp_dist; /* 注目しているノードとそこまでの最短距離 */
46
-
47
- int src, dest; /* 始点・終点ノード */
48
-
49
- int a, b, c, d, i, j;
50
-
51
- int fin; /* 未確定ノードが残っているかどうかのフラグ */
52
-
53
- FILE *fp; /* 距離の入ったファイルを示すポインタ */
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
- /*
66
-
67
- 距離行列の作成
68
-
69
- */
70
-
71
- for(i=0; i<NODE_NUM; i++){
72
-
73
- for(j=0; j<NODE_NUM; j++){
74
-
75
- graph[i][j] = MAX; /* 接続されていないノード間の距離をMAXにする */
76
-
77
- if(i==j){graph[i][j] = 0;}
78
-
79
- }
80
-
81
- }
82
-
83
- fp=fopen("./distance.txt", "r");
84
-
85
- while(fscanf(fp, "%d %d %d %d", &a, &b, &c, &d) != EOF) /* EOFまで4つ組を読み込む */
86
-
87
- {
88
-
89
- graph[a][b]=c;
90
-
91
- graph[b][a]=c;
92
-
93
- }
94
-
95
- fclose(fp);
96
-
97
-
98
-
99
- printf("Source Node?(0-%d)", NODE_NUM-1);
100
-
101
- fscanf(stdin, "%d", &src);
102
-
103
- printf("Destination Node?(0-%d)", NODE_NUM-1);
104
-
105
- fscanf(stdin, "%d", &dest);
106
-
107
-
108
-
109
-
110
-
111
- for(i=0; i<NODE_NUM; i++){
112
-
113
- dist[i] = MAX;
114
-
115
- chk[i] = 0;
116
-
117
- path[i] = NODE_NUM;
118
-
119
- }
120
-
121
- path[src] = src;
122
-
123
- dist[src] = 0;
124
-
125
- chk[src] = 1;
126
-
127
- tmp_node = src;
128
-
129
- fin = 0;
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
- int min = MAX;
138
-
139
- int target;
140
-
141
-
142
-
143
- while(fin == 0){
144
-
145
-
146
-
147
-
148
-
149
- for(i=0; i<NODE_NUM; i++){
150
-
151
-
152
-
153
- if(!chk[i] && dist[i]<min){
154
-
155
- min = dist[i];
156
-
157
- target = i ;
158
-
159
- }
160
-
161
- }
162
-
163
-
164
-
165
- for(tmp_node=0 ; tmp_node<NODE_NUM ;tmp_node++){
166
-
167
- if(dist[tmp_node] > graph[target][tmp_node] + dist[target]){
168
-
169
- tmp_dist = graph[target][tmp_node] + dist[target];
170
-
171
- path[tmp_node] = target;
172
-
173
- }
174
-
175
- }
176
-
177
-
178
-
179
- chk[target] = TRUE ;
180
-
181
-
182
-
183
-     if(chk[dest] == 1) fin = 1;
184
-
185
-
186
-
187
- }
188
-
189
- if(dist[dest]>=MAX){
190
-
191
- printf("No path from node%d to node%d.\n",src,dest);
192
-
193
- }else{
194
-
195
- printf("Shortest path from node%d to node%d is as follows.\n",src,dest);
196
-
197
- printf("%d <- ",dest);
198
-
199
- i=dest;
200
-
201
- for(i=path[i]; i!=src; i=path[i]){/* 前ノード表を辿る */
202
-
203
-
204
-
205
- }
206
-
207
- printf("%d\n",src);
208
-
209
- printf("Shortest distance is %d.\n", dist[dest]);
210
-
211
- }
212
-
213
- return 0;
214
-
215
- }
216
-
217
-
218
-
219
- ```

3

改善

2019/10/19 07:14

投稿

hheytakuc
hheytakuc

スコア8

test CHANGED
File without changes
test CHANGED
@@ -146,7 +146,7 @@
146
146
 
147
147
 
148
148
 
149
- for(i; i<NODE_NUM; i++){
149
+ for(i=0; i<NODE_NUM; i++){
150
150
 
151
151
 
152
152
 

2

不要なところが入っていたので消しました。

2019/10/18 08:54

投稿

hheytakuc
hheytakuc

スコア8

test CHANGED
File without changes
test CHANGED
@@ -94,7 +94,7 @@
94
94
 
95
95
  fclose(fp);
96
96
 
97
- if (FLAG == 0){
97
+
98
98
 
99
99
  printf("Source Node?(0-%d)", NODE_NUM-1);
100
100
 
@@ -104,7 +104,7 @@
104
104
 
105
105
  fscanf(stdin, "%d", &dest);
106
106
 
107
- }
107
+
108
108
 
109
109
 
110
110
 
@@ -140,7 +140,7 @@
140
140
 
141
141
 
142
142
 
143
- while(fin == 0){
143
+ while(fin == 0){
144
144
 
145
145
 
146
146
 

1

コードをすべて載せました。

2019/10/18 06:00

投稿

hheytakuc
hheytakuc

スコア8

test CHANGED
File without changes
test CHANGED
@@ -1,22 +1,110 @@
1
1
  c言語でダイクストラ法を実装してます。
2
2
 
3
- なかなかういこと動かないので、間違っているところがあれば教えてほしいす。
3
+ コンパイル後実行して、始点終点を入力した後に固まってしす。
4
-
5
- dist[] 距離
6
-
7
- chk[] 確定済みかどうか
8
-
9
- path[] 通った道
10
-
11
- tmp_node 注目ノード
12
-
13
- tmp_node 確定距離
14
4
 
15
5
 
16
6
 
17
7
  /////////////////
18
8
 
19
-
9
+ ```
10
+
11
+ #include <stdio.h>
12
+
13
+ #include <stdlib.h>
14
+
15
+ #include <time.h>
16
+
17
+
18
+
19
+ #define NODE_NUM 10 /* 総ノード数 */
20
+
21
+ #define MAX 9999 /* 無限大に相当する数 */
22
+
23
+ #define TRUE 1
24
+
25
+ #define FALSE 0
26
+
27
+
28
+
29
+
30
+
31
+ int main()
32
+
33
+ {
34
+
35
+ /* Dijkstraのアルゴリズム部分で必要な変数 */
36
+
37
+ int graph[NODE_NUM][NODE_NUM]; /* 距離行列 */
38
+
39
+ int path[NODE_NUM]; /* 前ノード表 */
40
+
41
+ int dist[NODE_NUM]; /* 距離を格納 */
42
+
43
+ int chk[NODE_NUM]; /* 最短距離確定のフラグ */
44
+
45
+ int tmp_node, tmp_dist; /* 注目しているノードとそこまでの最短距離 */
46
+
47
+ int src, dest; /* 始点・終点ノード */
48
+
49
+ int a, b, c, d, i, j;
50
+
51
+ int fin; /* 未確定ノードが残っているかどうかのフラグ */
52
+
53
+ FILE *fp; /* 距離の入ったファイルを示すポインタ */
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+ /*
66
+
67
+ 距離行列の作成
68
+
69
+ */
70
+
71
+ for(i=0; i<NODE_NUM; i++){
72
+
73
+ for(j=0; j<NODE_NUM; j++){
74
+
75
+ graph[i][j] = MAX; /* 接続されていないノード間の距離をMAXにする */
76
+
77
+ if(i==j){graph[i][j] = 0;}
78
+
79
+ }
80
+
81
+ }
82
+
83
+ fp=fopen("./distance.txt", "r");
84
+
85
+ while(fscanf(fp, "%d %d %d %d", &a, &b, &c, &d) != EOF) /* EOFまで4つ組を読み込む */
86
+
87
+ {
88
+
89
+ graph[a][b]=c;
90
+
91
+ graph[b][a]=c;
92
+
93
+ }
94
+
95
+ fclose(fp);
96
+
97
+ if (FLAG == 0){
98
+
99
+ printf("Source Node?(0-%d)", NODE_NUM-1);
100
+
101
+ fscanf(stdin, "%d", &src);
102
+
103
+ printf("Destination Node?(0-%d)", NODE_NUM-1);
104
+
105
+ fscanf(stdin, "%d", &dest);
106
+
107
+ }
20
108
 
21
109
 
22
110
 
@@ -97,3 +185,35 @@
97
185
 
98
186
 
99
187
  }
188
+
189
+ if(dist[dest]>=MAX){
190
+
191
+ printf("No path from node%d to node%d.\n",src,dest);
192
+
193
+ }else{
194
+
195
+ printf("Shortest path from node%d to node%d is as follows.\n",src,dest);
196
+
197
+ printf("%d <- ",dest);
198
+
199
+ i=dest;
200
+
201
+ for(i=path[i]; i!=src; i=path[i]){/* 前ノード表を辿る */
202
+
203
+
204
+
205
+ }
206
+
207
+ printf("%d\n",src);
208
+
209
+ printf("Shortest distance is %d.\n", dist[dest]);
210
+
211
+ }
212
+
213
+ return 0;
214
+
215
+ }
216
+
217
+
218
+
219
+ ```