[1.1] 枝リストの入っているデータファイルを読み込み,隣接行列を求めてから平均頂点間距離を求めるコードを作成しています.
[1.2] 以下にコードを載せます.
//平均頂点間距離を求めるコード
/* 隣接行列の作成*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* 文字列関数を扱えるようにする*/
#define maxN 1000 /* 扱う頂点数の最大値,ここでは1000 に設定*/
/*ワーシャルフロイド法*/
void warshall_floyd(int N, int Adj[N][N], double length[N][N]){
int i,j,k;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
for(k=0;k<N;k++){
length[j][k] = length[j][i] + length[i][k];
}
}
}
}
int main(void)
{
int N, M; /* 頂点数,辺数*/
int Adj[maxN][maxN]; /* 隣接行列を表す変数*/
/* 必要な変数を宣言*/
int u,v;
int i, j, k;
double length[N][N];//頂点間距離
double ave_length;//平均頂点間距離
int branch;
char fname[128]; /* 読み込むファイルの名前*/
FILE *fp; /* 入力ファイル*/
printf("input filename: "); /* ファイル名の入力を要求*/
/* 入力ファイルの操作*/
fgets(fname,sizeof(fname),stdin);
fname[strlen(fname)-1]='\0';
fflush(stdin);
fp = fopen(fname, "r"); /* ファイルを読み込みモードで開く*/
fscanf(fp, "%d %d", &N, &M); /* ファイルからN, Mを読み込む*/
for (u=0; u<N+1; u++){ /* 隣接行列の初期化*/
for (v=0; v<N+1; v++){
Adj[u][v] = 0;
}
}
while(! feof(fp))
{
/* 頂点u,vを読み込む */
fscanf(fp, "%d %d", &u, &v);
if( u > N )
{
N = u; //uがNより大きかった場合、uを代入
}
Adj[u][v] = 1;
Adj[v][u] = 1;
}
fclose(fp);
printf("Adjacency matrix\n"); /* 隣接行列出力*/
for (u=0; u<N; u++){
printf("%2d |", u);
for( v=0; v<N; v++){
printf("%2d ", Adj[u][v]);
}
printf("\n");
}
//lengthの初期化
for(i=0; i<N; i++){
for(j=0; j<N; j++){
length[i][j] = 0;
}
}
//ワーシャルフロイド法で全点対最短経路を求める
warshall_floyd(N, Adj, length);
for(i=0;i<N;i++){
for(j=0;j<N;j++){
ave_length += length[i][j];
}
}
branch = N * (N+1);
printf("平均頂点間距離: %lf\n", ave_length/branch);
return 0;
}
どこの部分を変えればいいのか教えていただけると嬉しいです.
[2] 環境
[2.1] OS : MacOS
[2.2] コンパイラ名 : gcc