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

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

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

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

Q&A

解決済

1回答

958閲覧

平均時間計算ができない

katkey

総合スコア15

C

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

0グッド

0クリップ

投稿2021/01/26 03:22

編集2021/01/26 03:24

実現したいこと

下記は最短経路長を求めるプログラムなのですが、地点数Nに対する平均経路長を求めたいです。(Nは順に増やしMまで行う)
下記のように書いたのですが、プログラムがループしてしまい求めることができません。
どのようにすれば、よいでしょうか。
補足)最短経路長を求めるのに失敗した場合、地点数Nを変えないで再度、経路長を求めるようにしています。

該当のソースコード

c

1#include<stdio.h> 2#include<stdlib.h> 3#include<math.h> 4#include<time.h> 5 6#define visit 1.0 7#define M 100 8 9typedef struct xy{ 10 double x; 11 double y; 12}VTEX; 13 14int i,j,k,rmin,N; 15VTEX pt[M]; 16double r[M][M]; 17double min,s; 18clock_t start_clock, end_clock; 19 20void ransuu(void){ 21 for(k=0;k<N;k++){ 22 pt[k].x=(double)rand()/RAND_MAX; 23 pt[k].y=(double)rand()/RAND_MAX; 24 //printf("pt[%d]=(%f %f)\n",k,pt[k]); 25 } 26} 27 28void length(void){ 29 for(i=0;i<N-1;i++){ 30 for(j=1+i;j<N;j++){ 31 r[i][j]=sqrt((pt[i].x-pt[j].x)*(pt[i].x-pt[j].x)+(pt[i].y-pt[j].y)*(pt[i].y-pt[j].y)); 32 printf("r[%d][%d]=%f\n",i,j,r[i][j]); 33 } 34 } 35} 36 37int hantei(void){ 38 min=0,s=0,rmin=0; 39 double a[M]={0}; 40 for(k=0;k<N;k++) 41 r[k][k]=visit; 42 int c=-1, d=-1; 43 min=r[c+1][d+1]; 44 while(rmin<N){ 45 ++rmin; 46 //printf("%d\n",rmin); 47 for(i=0;i<N-1;i++){ 48 for(j=1+i;j<N;j++){ 49 if(a[i]>=2.0) continue; 50 if((min>r[i][j])&&!(r[i][j]==visit)&&(a[j]<2)){ c=i; d=j; min=r[c][d];printf("%d %d\n",c,d);} 51 //printf("%d %d\n",c,d); 52 } 53 } 54 printf("%dから%dへの線 min:%f\n",c+1,d+1,r[c][d]); 55 for(k=0;k<N;k++){ 56 if((c==k)||(d==k))a[k]+=visit; 57 } 58 s+=min; 59 min=visit; r[c][d]=visit; 60 //printf("b[%d]:%f\n",c,b[c]); 61 } 62 for(k=0;k<N;k++){ 63 if(!(a[k]==2.0)){ 64 rmin=0; 65 printf("最短経路長を求めるのに失敗しました"); 66 return 1; 67 } 68 } 69 printf("最短経路長は%f\n",s); 70} 71 72int main(void){ 73 srand((unsigned int)time(NULL)); 74 double a[M],s; 75 for(int N=1;N<M;N++){ 76 a[M]=0; 77 start_clock=0,end_clock=0; 78 printf("%d回目\n",N+1); 79 ransuu(); 80 length(); 81 start_clock=clock(); 82 hantei(); 83 end_clock=clock(); 84 if(rmin!=5){ 85 N=N-1; 86 continue; 87 } 88 a[N]=(double)(end_clock-start_clock)/CLOCKS_PER_SEC; 89 s+=a[N]; 90 91 //printf("%f\n",a[n]); 92 } 93 printf("平均時間計算量:%f\n",s/M); 94 return 0; 95}

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

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

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

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

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

guest

回答1

0

自己解決

c

1int main(void){ 2 s=0; 3 int N; 4 for(int N=0;N<M;N++){ 5 srand((unsigned int)time(NULL)); 6 start_clock=0,end_clock=0; 7 printf("%d回目\n",N+1); 8 ransuu(N); 9 length(N); 10 start_clock=clock(); 11 hantei(N); 12 end_clock=clock(); 13 if(rmin!=N) continue; 14 b[N]=(double)(end_clock-start_clock)/CLOCKS_PER_SEC; 15 s+=b[N]; 16 17 //printf("%f\n",a[n]); 18 } 19 printf("平均時間計算量:%f\n",s/M); 20 return 0; 21}

上記のようにすることで実装できた。
しかし、これでは平均経路長を求められなかったときにカウントを飛ばしてしまっているので、厳密なNに対する平均時間を求めてはいない。
次からはよく考えて質問します。

投稿2021/01/26 08:48

katkey

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問