#include #include #include #include using namespace std; int main(int argc, char *argv[]) { //変数の宣言。 int mtx1[20][20], mtx2[20][20], mtx3[20][20], mtx4[20][20]; int n, i, j, k; int nlink=2, max=9999; //コマンドライン引数が1つでない場合は,使用法を表示して終了する。 if(argc != 2) { cerr << "Usage: shimbel \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]; //mtx1の内容をmtx2にコピー。 } } for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { mtx4[i][j] = 9999; //mtx4の各要素に9999を入れる。 } } for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { if(i == j) { mtx4[i][j] = 0; //対角要素には0を入れる。 } else if(mtx1[i][j] == 1) { mtx4[i][j] = 1; //直接リンクがあるノード対には1を入れる。 } } } nlink = 2; //2つのリンクを経る経路から始める。 while(1) { //無限ループ。 for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { mtx3[i][j] = 0; //mtx3の各要素に0を入れる。 } } for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { for(k=1; k<=n; k++) { mtx3[i][j] += mtx2[i][k] * mtx1[k][j]; //行列の掛け算。 } if (mtx3[i][j] != 0){ if(mtx4[i][j] > nlink) { mtx4[i][j] = nlink; //新たに非ゼロとなった要素にステップ数を入れる。 } } } } //mtx4の要素の最大値を求める。 max = 0; for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { if(mtx4[i][j] > max) { max = mtx4[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]; //mtx3の内容をmtx2にコピー。 } } nlink++; //nlinkを1増やす。 } //無限ループここまで。 //結果の出力。 cout << n << "\n"; //行・列数の出力。 for(j=1; j<=n; j++) { for(i=1; i<=n; i++) { cout << mtx4[i][j]; //行列各要素の出力。 if(i < n) { cout << "\t"; //各列はタブで区切る。 } } cout << "\n"; //各行は改行で区切る。 } return 0; //戻り値として0を返す。 } //プログラムの終わり。