#include #include #include #include using namespace std; int main(int argc, char *argv[]) { //変数の宣言。 float mtx1[20][20], mtx2[20][20], mtx3[20][20]; float min, max; int n, i, j, k; //コマンドライン引数が1つでない場合は、使用法を表示して終了する。 if(argc != 2) { cerr << "Usage: dist \n"; return 1; } //ファイルを開く。エラーの場合はその旨表示して終了する。 ifstream fin(argv[1]); if(!fin) { cerr << "Can't open file!\n"; return 1; } //ファイルの内容の読み込み。 fin >> n; //行列の行・列数の読み込み。 for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { fin >> mtx1[i][j]; //行列各要素の読み込み。 } } fin.close(); //ファイルを閉じる。 for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { mtx2[i][j] = mtx1[i][j]; //行列内容のコピー。 } } while(1) { for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { mtx3[i][j] = 0; //行列3はゼロで初期化しておく。 } } for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { min = 9999; for(k=1; k<=n; k++) { if(min > mtx2[i][k] + mtx1[k][j]) { min = mtx2[i][k] + mtx1[k][j]; //経路の最短距離を算出。 } } mtx3[i][j] = min; } } max = 0; for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { if(mtx3[i][j] > max) { max = mtx3[i][j]; //行列の最大値を求め… } } } if(max < 9999) break; //"9999"がなくなったらループを抜ける。 for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { mtx2[i][j] = mtx3[i][j]; //行列2に行列3をコピー。 } } } //結果を標準出力に出力。 cout << n << "\n"; //行・列数の出力。 for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { cout << mtx3[i][j]; //行列各要素の出力。 if(i < n) { cout << "\t"; //各列はタブで区切る。 } } cout << "\n"; //各行は改行で区切る。 } return 0; //戻り値として0を返す。 } //プログラムの終わり。