トピック接続します。http://acm.hdu.edu.cn/showproblem.php PID = 1599?
のみフロイド激しいMP [I]を解くことは、[i]は、次に問題を見つける場合タイトルは、最低必要なフープ図形を必要としないような、次いで1-> 3、3を得た1-> 2、> 3 2-、など - > 1 == 1 - > 3、図は> 2 1-> 3 2-、> 2 3-、> 1 2-なり、その理由は、ループとしてカウントされていない場合、それらは相互に希望最小リング方法を模索するために、
例えば、最初の(1-K-1)と、図のパスのij kが緩和されていないため、エッジに続いて、リラックス(I、K)と、別のパス(K、J)を得るので、I(I、K )および(パスとパスのK、j)は(i、j)は、必ずしも同じではないが、我々は現在のを保証することはできません。この時間がので、各ケースするために考慮しなければならない最短であります
最小のリングを与えるために、
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define INT_MAX 0x73f3f3f INT MP [ 110 ] [ 110 ]。 INTの DIST [ 110 ] [ 110 ]。 ボイドINTT(){ ため(int型 i = 0 ; iは< 110 I ++; ) のための(INT J = 0 ; J < 110 ; J ++ ) 場合(I == j)はMP [I]、[J]を= DIST [I] [J] = 0 ; 他の distの[I] [J] = MP [I] [J] = INT_MAX。 } INT のmain() { int型M、N。 一方、(〜のscanf(" %d個の%のD "、&M&N)){ INTT()。 int型 ANS = INT_MAX。 以下のために(int型 i = 0 ; iがn <Iは、++は){ int型、B、Cと、 scanf関数(" %D%D%D "、&、&B、&C)。 もし(MP [A- 1 ] [B- 1 ]> C)MP [A- 1 ] [B- 1 ] = DIST [A- 1 ] [B- 1 ] =のC。 もし(MP [B- 1 ] [A- 1 ]> C)MP [B- 1 ] [A- 1 ] = DIST [B- 1 ] [A- 1 ] =のC。 } // ため(INT i = 0; iがm <; iは++){ // ため(INT J = 0であり、j <M、J ++){ // のprintf( "%dの"、MP [I] [J]) ; // } // のprintf( "の\ n"); // } のための(int型のk = 0 kは++; M <K ){ ため(int型 I = 0 ; I <K iが++ ){ 用(int型 J = I + 1、J <K、J ++ ){ // のprintf( "++%D%D%D ---%D ---%D%D%D \ n"は、MP [I] [ K]、MP [j] [k]は、MP [I]、[J]、ANS、I、J、K)。 ANS =分(ANS、(DIST [I] [K] + DIST [J] [K] + MP [I] [J]))。 } } // ため(; iがmを<; I = 0 int型私は++){ // ため(INT J = 0であり、j <M、J ++){ // のprintf( "%dの"、MP [I] [J] ); // } // のprintf( "の\ n"); // } ため(int型 i = 0 ; iがmを<; iは++ ){ ため(INT J = 0 ; J <Mであり、j ++ ){ // もし(I == j)を続けます。 [I] [J] =分(MP [I] [j]を、MP [I] [K] +融点MP [J] [K])。 } } } // (I = 0 int型、iが<M; iが++)のために{ // ため(INT J = 0であり、j <M、J ++){ // のprintf( "%dの"、MP [I] [J ]); // } // のprintf( "の\ n"); // } // ため(; iがmを<; I = 0 int型私は++){ // もし(!MP [i]は[I] = INT_MAX){ // //IF(ANS == - 1)ANS =融点[I] [I]。 // 他ANS =分(ANS、MP [I] [I])。 // } // } の場合(ANS = INT_MAX!)のprintf(" %d個の\ nを" 、ANS)。 他のprintf(" それは不可能です\ N。" ); } 戻り 0 。 }