質問内容
以下のリンクの問題を解いていたのですが,自分のやり方では配列が大きくなりすぎてしまってコンパイルが出来ない状態です.
小さくするには二次元から一次元に変えればいいのではと思ったのですが,記憶して後で使用しているのでそれもできませんでした.どのようにすれば小さい配列に落とし込むことが出来るのか教えてください.
問題
C
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5#define A 100000 6 7int reach[A][A] 8 9int main(void){ 10 int numdesk,numroad; 11 12 scanf("%d %d",&numdesk,&numroad); 13 14 int *height,**road; 15 16 height=(int *)malloc(sizeof(int)*numdesk); 17 18 for(int i=0;i<numdesk;i++) scanf("%d",height[i]); 19 20 road=(int **)malloc(sizeof(int *)*numroad); 21 for(int i=0;i<numroad;i++) road[i]=(int *)malloc(sizeof(int)*2); 22 23 24 for(int i=0;i<A;i++){ 25 for(int j=0;j<A;j++) reach[i][j]=0; 26 } 27 int num[A]={0}; 28 29 for(int i=0;i<numroad;i++){ 30 scanf("%d %d",road[i][0],&road[i][1]); 31 reach[road[i][0]][num[road[i][0]]]=road[i][1]; 32 reach[road[i][1]][num[road[i][1]]]=road[i][0]; 33 } 34 35 int maxID[A]={0}; 36 int maxH=0; 37 int flag[A]={0}; 38 39 for(int i=0;i<numdesk;i++){ 40 int k=0; 41 maxID[i]=i+1; 42 maxH=height[i]; 43 while(reach[i][k]!=0){ 44 if(height[reach[i][k]]>maxH) { 45 maxH=height[reach[i][k]]; 46 maxID[i]=reach[i][k]; 47 } 48 k++; 49 } 50 flag[maxID[i]]=1; 51 } 52 53 int count=0; 54 55 for(int i=0;i<numdesk;i++){ 56 count+=flag[i]; 57 } 58 59 printf("%d\n",count); 60 61 62 return 0; 63}