質問内容
典型的な最短経路長の問題を解いていたのですが,ケースが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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/15 02:49