下記のプログラムでは初めにadj_matという隣接行列を定義した後にそれを隣接リストの形に変えています。
adj_index[N_VERT]=index; 以下では、配列adj_listおよびadj_indexを用いて、originから頂点i(i=0~7)までの距離をoriginからの幅優先探索で求め
dist_vecに格納するように、プログラムを作りたいです。G~Mに入るプログラムを教えてください。
現在C言語は猫でもわかるC言語を終えたレベルで、アルゴリズムは一通り学びました。
ちなみにこれはある大学院の過去問になってます、答えがわからないためこちらで質問させていただきました。よろしくお願いします
#include<stdio.h>
#define UNREACH -1
#define N_VERT 8
const int adj_mat[N_VERT][N_VERT]={
{0,1,0,1,0,1,0,0},
{0,0,1,0,0,0,0,0},
{0,0,0,1,0,0,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,0,1,0,1},
{0,0,0,0,0,0,1,0},
{0,0,1,0,0,0,0,1},
{1,0,0,0,0,0,0,0},
}
void calc_dists(const int origin, int dist_vec[]){
int adj_list[N_VERT * N_VERT],adj_index[N_VERT+1];
int array1[N_VERT],array2[N_VERT];
int* curr=array1, * next=array2, *tmp;
int i,j,index=0,dist=1,len_curr=1,len_next=0;
//隣接行列を隣接リストにする//
for(i=0;i<N_VERT;i++){
adj_index[i]=index;
for(j=0;j<N_VERT;j++){
if(adj_mat[i][j]==1){
adj_list[index++]=j;
}
}
}
//ここ以降何をしているかわからない//
adj_index[N_VERT]=index;
for(i=0;i<N_VERT;i++){
dist_vec[i]=UNREACH;
}
curr[0]=origin;
dist_vec[origin]=0;
while(len_curr>0){
for(i=0;i<len_curr;i++){
for(j=//G//;j<//H//;j++){
if(//I//==//J//){
//K//=dist;
//L//=//M//;
len_next++;
}
}
}
tmp=next;
next=curr;
curr=tmp;
len_cur=len_next;
len_next=0;
dist++;
}
}