質問の意味:一見すると最小出力の面が出力されますが、精密検査だけで訪問したので、最小値が過ごしたすべての時間をポイントツーポイント1からの最小値が、実際には、これらのノードの最大値を訪問することですされていることが分かりますポイントにアクセスする最大時間は、すべての点を考慮しました。だから、ほとんどの短絡の最大値を求めました。
書式#include <iostreamの> の#include <CStringの> の#include <cstdioを> 使用して 名前空間はstd; const int型 MAXN = 100 + 5 。 const int型 INF = 0x3f3f3f3f 。 int型nは、[MAXN] [MAXN]融点、[MAXN] DIS。 BOOL VIS [MAXN]。 インラインint型の最大値(int型、int型B){ 返す > bは?A:B; } インラインINT分(INT A、INT B){ 戻り <bは?A:B; } インラインINT をDij(){ memsetの(VIS、0、はsizeof (VIS))。 memset(DIS、INF、はsizeof (DIS))。 DIS [ 1 ] = 0 ; 用(int型 i = 1 ; iがN <I ++は{) INT minid、MIN = INF。 以下のための(int型 J = 1 ; J <= nであり、j ++)の場合(!VIS [J] && MIN> DIS [J])MIN = DIS [minid = J]; VIS [minid] = 1 。 以下のための(int型 J = 1 ; J <= N。J ++)であれば!(VIS [J])DIS [J] =分(DIS [J]、[minid] + DIS )[minid] [j]を融点; } int型のRES = - INFと、 以下のために(int型 I = 2 ; iが++; iが<= N ) RES = MAX(RES、DIS [I])。 リターンのres; } int型のmain(){ // freopenは( "in.txt"、 "R"、STDIN)。 scanf関数(" %のD "、&N) 以下のために(int型 I = 2 ; iが<= N; iは++ ) のために(int型 J = 1 ; J <I。J ++ ){ チャー S [ 10 ]。 scanf関数(" %sの" 、S); もし(S [ 0 ] == ' X ')MP [I] [J] =融点[J] [I] = INF。 他{ INT W = 0 。 用(int型のk = 0 ; S [k]は、++ k個){ W * = 10 。 W + S = [K] - ' 0" ; } MP [I] [J] =融点[J] [I] = W。 } } のprintf(" %d個の\ n " 、をDij())。 リターン 0 ; }