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

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

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

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

Q&A

解決済

1回答

1064閲覧

乱数の値がきちんと格納されていない

katkey

総合スコア15

C

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

0グッド

1クリップ

投稿2021/01/27 05:21

発生している問題・エラーメッセージ

最大流量を求めるようなプログラムを作っています。
ransuuという関数で、adjacency matrixに格納されている数字が1だったら、flowing matrixに100までの数字をランダム格納したいのですが、以下の表を見ると1なのに値が格納されていない部分があります。
もしわかる方いましたら、回答をお願いします。

Adjacency Matrix: 0 0 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 Flowing Matrix: 0 0 0 0 0 0 55 28 0 59 0 51 57 0 11 56 93 71 0 0 3 63 54 0 0 0 0 99 75 38 0 0 24 49 54 17 0 26 0 0 6 0 74 0 0 86 79 0 39 0 60 35 0 83 0 0 16 0 0 0 0 84 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

該当のソースコード

c

1#define visit 1 2#define nonvisit 0 3#define stop 2 4#define M 5 5 6int i,j,k,min,sum=0; 7int a[M][M],v[M],r[M][M],b[M],d[M]; 8clock_t start_clock, end_clock; 9 10void ransuu(int N){ 11 printf("Adjacency Matrix:\n"); 12 for(i = 1; i <= N; i++){ 13 for(j = 1; j <=N; j++){ 14 a[i][j]=rand()%2; 15 printf("%d ",a[i][j]); 16 } 17 printf("\n"); 18 } 19 printf("Flowing Matrix:\n"); 20 for(i = 1; i <= N; i++){ 21 for(j = 1; j <=N; j++){ 22 if(a[i][j]==1){ 23 r[i][j]=rand()%100;}else{ 24 r[i][j]=0; 25 } 26 printf("%3d",r[i][j]); 27 } 28 printf("\n"); 29 } 30} 31 32int hantei(int s,int t,int N){ 33 int current, count; 34 current=s; count=1, min=N+1; 35 for(k=1;k<=N;k++){ 36 v[k]=nonvisit; 37 a[k][k]=0; 38 r[k][k]=0; 39 d[k]=0; 40 } 41 v[s]=visit; d[count]=current; 42 j=current; 43 while(current!=t){ 44 if(v[t]==visit) break; 45 if((a[current][j]==1)&&(v[j]==nonvisit)){ 46 count++; 47 d[count]=j; 48 //printf("d[%d]:%d\n",count,j); 49 v[j]=visit; 50 if(r[current][j]<min) min=r[current][j]; 51 current=j; 52 j=s+1; 53 } 54 j++; 55 } 56 for(count=1;count<N;count++){ 57 r[d[count]][d[count+1]] = r[d[count]][d[count+1]]-min; 58 if(r[d[count]][d[count+1]]==0) a[d[count]][d[count+1]]=stop; 59 printf("r[%d][%d]:%d\n",count,count+1,r[d[count]][d[count+1]]); 60 } 61 for(k=2;k<=N;k++){ 62 if(r[s][k]>0) hantei(s,t,N); 63 } 64 printf("探索終了\n"); 65 for(k=2;k<=N;k++){ 66 sum+=r[s][k]; 67 } 68 printf("最大流量は%f\n",sum); 69 exit(0); 70} 71 72int main(void){ 73 int sum2; 74 int N=10; 75 srand((unsigned int)time(NULL)); 76 //for(int N=0;N<M;N++){ 77 start_clock=0,end_clock=0; 78 printf("%d回目\n",N+1); 79 ransuu(N); 80 start_clock=clock(); 81 hantei(1,N,N); 82 end_clock=clock(); 83 b[N]=(double)(end_clock-start_clock)/CLOCKS_PER_SEC; 84 sum2+=b[N]; 85 //} 86 printf("平均時間計算量:%f\n",sum2/M); 87 return 0; 88}

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

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

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

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

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

guest

回答1

0

ベストアンサー

for(i = 1; i <= N; i++){

for(j = 1; j <=N; j++){ a[i][j]=rand()%2;

これでは範囲外アクセスとなります
b[5] で定義したなら、アクセスできる範囲は、b[0]からb[4]までです

投稿2021/01/27 05:25

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問