この質問は、質問の目的は、非常に明確である最短かつ統計的合計であることを、非常に明確なダイアグラムのトピックです。N <= 100、一つは、あなたがn ^フロイド3の考えることができるデータの範囲を見ることができますが、ほとんどの短絡の数を取得する方法を検討しますか?
最初は私が前フロイドの最短経路を考えていた、そして、統計の最短数をダイクストラ私はダイクストラの最短をカウントしますので。単一ソース最短のダイクストラので、n個のこの複雑添加以来。
実際には、それにフロイド、としてあなたが最短パスの数を数えることができる最短の道を模索。統計最短事実は、乗算原理を解決するために使用することができます。
提供DIS [I] [J]であり、I> J最短である、方法[I] [J]であるI-> jの最短経路の数であり、中間点kがあります。
カテゴリートーク:
1.もしDIS [I] [J]> DIS [I] [K] + DIS [K] [J]。これは、作品のJ番号[i]が[K] *道[K] [j]は、最短の方法です> I-から、最短を更新するために、私たちが必要です
前記最短距離の電流経路が等しい場合、唯一の方法累積[I] [K] *方法[K] [j]を元に基づく値です。
そして、話題の式に従って、それを行います。統計パスにLONGLONG注意を開くには、タイトルにもヒントを与えました。
コードは以下の通りであります:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E6 + 7 。 CONSTの INT N = 550 。 const int型 INF = 88888888 ; INTのMP [N] [N]。 長い 長い道[N] [N]。 INTのN、M。 INTのX、Y、V。 ダブル合計[MAXN]。 ボイドフロイド(){ 用(int型のk = 1 ; K <= N; ++ k個){ ため(int型 iは= 1は iが++; iがn = < {) 用(INTの J = 1 ; J <= nであり、j ++ ){ 場合(!!I = K && I = J && K = J){ 場合(MP [I] [J]> MP [I] [K] + MP [K ] [J]){ MP [I] [J] =融点[I] [K] + MP [K] [J]。 方法[I] [j]は [I] [K] *よう= 道[K] [j]を。 } そう であれば、[I] [K] *(MP [I] [J] == MP [I] [K] + MP [K] [J])方法[I] [J] + =ような方法[K] [J]。 } } } } } int型(メイン){ scanf関数(" %D%dの"、&N、&M); 以下のために(int型 i = 1 ; iが<= N; iは++ ){ ための(int型 J = 1 ; J <= N; J ++)MP [I] [J] = INF。 } のために(int型 i = 1 ; iがn = <; I ++の)融点を[I] [I] = 0 ; 以下のために(int型私= 1 ; I <= M; iは++ ){ scanf関数(" %D%D%D "、およびX&Y、およびV)。 MP [X] [Y] =融点[Y] [X] = V。 方法は、[X] [Y]は方法[Y] [X] = = 1 。 } フロイド()。 以下のために(int型のk = 1 ; kは<= nであり、k ++ ){ ため(int型 iは= 1 ; iが<= N; iが++ ){ ため(INT J = 1 ; J <= nであり、j ++ ){ もし I(=! !J && J = K && I = K){ 長い 長い [I] [K] * LJB =ような方法[K] [J]。 もし(MP [I] [J] == MP [I] [K] + MP [K] [J])の和[K] + =(LJB * 1.000)/ 方法[I] [J]。 } } } } のために(int型のI =1 ; iが<= N; iが++)のprintf(" %の.3lfする\ n " 、和[I])。 リターン 0 ; }