実現したいこと
下記は最短経路長を求めるプログラムなのですが、地点数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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。