質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

2086閲覧

ダイクストラ法の無限ループ

grape_ll

総合スコア83

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/06/14 12:13

質問内容

典型的な最短経路長の問題を解いていたのですが,ケースが4つあるうちの3つは通るのに一つでは実行時間が3秒を超えてしまって正解になりませんでした.終了条件の何が悪いのか教えてほしいです.

コード

C

1#include<stdio.h> 2 3#define inf 10000000 4#define size 1000 5#define true 1 6#define false 0 7 8int dist[size][size]; 9int cost[size]; 10int via[size]; 11int n; 12char used[size]; 13 14int dijkstra(int start,int goal){ 15 int min,target; 16 int i; 17 cost[start]=0; 18 while(1){ 19 min=inf; 20 for(i=0;i<n;i++){ 21 if(!used[i]&&min>cost[i]){ 22 min=cost[i]; 23 target=i; 24 } 25 } 26 if(target==goal) return cost[goal]; 27 28 int neighbor; 29 for(neighbor=0;neighbor<n;neighbor++){ 30 if(cost[neighbor]>dist[target][neighbor]+cost[target]){ 31 cost[neighbor]=dist[target][neighbor]+cost[target]; 32 via[neighbor]=target; 33 } 34 } 35 used[target]=true; 36 } 37} 38 39int main(void){ 40 int b,e,l; 41 int s=0,g=1; 42 int i,j; 43 for(i=0;i<size;i++){ 44 cost[i]=inf; 45 used[i]=false; 46 via[i]=-1; 47 for(j=0;j<size;j++){ 48 dist[i][j]=inf; 49 } 50 } 51 scanf("%d",&n); 52 while(scanf("%d",&b)!=EOF){ 53 scanf("%d %d",&e,&l); 54 if(b==0&&e==0&&l==0) break; 55 dist[b][e]=l; 56 } 57 printf("%d\n",dijkstra(s,g)); 58 return 0; 59}

正解したケース

2
0 1 10
答え:10

11
0 2 10
2 5 9
5 4 3
5 8 14
3 4 19
3 6 11
6 8 18
4 8 15
4 9 11
8 10 12
7 10 9
10 1 8
答え:53

7
0 2 1
2 3 1
3 4 1
4 5 1
5 6 1
6 1 1
2 4 19
2 5 13
2 6 21
3 6 12
4 6 8
答え:6

実行時間をこえたケース

6
0 3 5
0 4 3
0 5 2
1 2 1
1 5 6
2 3 2
2 4 3
答え:7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

最後のケースの正答をみるにおそらく問題設定としては無向グラフなんでしょうか
今のコードでは入力された辺が b から e へ向かうものしかセットされていないので、ゴールにたどり着けず無限ループに陥っているんでしょう。

投稿2020/06/14 15:24

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grape_ll

2020/06/15 02:49

無向グラフでしたご指摘ありがとうございます. 逆向きもいれてあげたら通りました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問