この事は良いアイデアです。
溶液は、添加に乗算同様に、マトリックスパワー加算分に取り込まれ、そして同じfloyedです。この場合には、行列演算は、最短の緩和に相当します。
行列を構築するプロセスは比較的簡単で、離散することができ、当然のことながら、以下の別のより良いプレーがあり、そこから学ぶことができます。
#include <iostreamの> する#include <アルゴリズム> の#include <cmath> の#include <CStringの> する#include <cstdioを> する#include <ベクトル> の#include < 設定 > の#include <地図> の#include <キュー> の#include <積層> 使用して 名前空間はstdを、 int型読み取り(){ int型の和= 0、F = 1。チャー X = GETCHAR()。 一方、(X < ' 0 ' || X> ' 9 'もし(x == ' - ')、F = - 1 。 X = GETCHAR()。 } 一方、(X> = ' 0 ' && X <= ' 9 ' ){ 合計 =合計* 10 + X - ' 0 ' 。 X = GETCHAR()。 } 戻り値の和* F。 } int型K、M、S、E、NUM。 int型の ID [ 2000 ]; 構造体マトリックス{ INT X [ 600 ] [ 600]; ボイド追加(int型、int型 B、INT C){ X [A] [B] = Cと、 返します。 } 友人マトリックス演算子 * (行列Bの行列){ 行列C。 memset(CX、0x3fを、はsizeof (CX))。 以下のために(int型 I = 1 ; I <= NUM; iは++ ) のために(INT J = 1 ; J <= NUM; J ++ ) のための(INT K = 1; K <= NUMあり、k ++ ) CX [I] [J] =分(CX [I] [J]、斧[I] [K] + BX [K] [J])。 リターンC; } ボイドDB(){ COUT << ENDL。 以下のために(int型私= 1 ; I <= NUM; iが++ ){ ため(INT J = 1 ; J <= NUM; J ++ ) COUT << X [i]は[J] << " " 。 coutの << てendl; } } ボイド(PUT のint、int型B){ printf(" %dの" 、X [A] [B])。 返します。 } }。 ボイド qpow(int型K){ 行列C =、B = 。 // b.db(); 用(; kは、kは>> = 1、B = B * b)の 場合(K&1)C = C * B。 // c.db(); = C。 } int型のmain(){ K =リード(); M =()を読み出す; S =)は(読み込み; E = 読み取ります()。 memset(AX、0x3fを、はsizeof (AX))。 以下のための(int型 I = 1、I <= M; I ++は、X、Y、Z ){ Z =を読み取る(); X =読み取る(); Yは。= 読み取ります(); ID [X] = ID [X] ID [X]:++ NUM。 ID [Y] = ID [Y] ID [Y]:++ NUM。 a.add(ID [x]は、ID [Y]、Z); a.add(ID [Y]、ID [x]は、Z)。 } // a.db()。 qpow(K- 1 )。 // a.db(); a.put(ID [S]、ID [E])。 リターン 0 ; }
このような遊びはによると、初期行列で直接行われるN- = A * N-1-完了操作は、スタート行列は誰はい明確ではないからです。
定義行列は別の行列であるため、その後、前の行列がそうである理由を考え出し、ある乗算仕上げ行列行列の掛け算によってので、前者はなぜすべての対角線1の理由である、または元の行列をこの行列の後に行列の性質を満たすことができます。
行列は任意の行列を掛けるか(とら分まあ以来の)元の行列を完了するのでそこで問題は、このマトリックス正の無限大行列です。