最小環+(hdu1599)を探しているフロイド例

    トピック接続します。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 
}

 

おすすめ

転載: www.cnblogs.com/fzw1523/p/11200759.html