2021 01 24弗洛伊德演算法 高精度

2021-10-17 11:05:52 字數 1781 閱讀 7262

首先通過初步閱讀題目,就可以發現這是乙個關於排列組合的問題,但仔細研讀以及通過閱讀題解後發現,這裡存在乙個隱含的條件,例如1->2,2->3,那麼1也可以通過兩次變化變成3,這裡就可以初步發現這個問題實際已經轉化成了乙個圖論的問題,翻譯一下就是有若干個城市,現在已知若干條道路可以將其中的一些城市連線起來,問你其中全部可以互相到達的城市,這裡就可以用到弗洛伊德演算法。`

inline

void

floyd()

這大概就是乙個最最基礎的弗洛伊德演算法的模型,簡單解釋一下就是看看i,j之間是否通過k之間可以聯絡起來。我個人覺得這裡最需要注意的一點是中間值k要放在最開始進行遍歷。

然後這裡還要用到高精度的一些東西,因為這裡的資料範圍已經遠遠超過了long long 所以必須要用到高精度的東西。

int len =

2; num[1]

=1;for

(int i =

0;i <

(int

)str.

length()

;i++

)//這裡是你輸入的這個數的長度

while

(num[len]

) len++

;//求出長度

}for

(int i = len-

1;i >=

1;i--

) cout << num[i]

;//輸出

總結起來就是一句話,先是用弗洛伊德演算法算出每個數與之相連(包括它本身)數的個數,然後實際上就是遍歷你輸入的這段數,把他們對應相連數的個數全部乘起來即可,就算沒有數與之相連,那麼就是1,不影響最終的結果。最後貼上完整**

#include

#include

using

namespace std;

string str;

int k,vis[10]

[10],f[10]

,num[

101]

;inline

void

floyd()

int main (

)for

(int i =

0;i <=

9;i++

) vis[i]

[i]=

true

;//自己可以變成自己

floyd()

;for

(int i =

0;i <=

9;i++

)for

(int j =

0;j <=

9;j++)if

(vis[i]

[j]) f[i]++;

//求出i可以變成多少種數字

int len =

2; num[1]

=1;for

(int i =

0;i <

(int

)str.

length()

;i++

)while

(num[len]

) len++

;//求出長度

}for

(int i = len-

1;i >=

1;i--

) cout << num[i]

;//輸出

return0;

}

弗洛伊德演算法

弗洛伊德演算法 floyd 又稱為是插點法。目的是求加權圖中頂點中最短路徑的方法。本文通過舉例子的方法想你具體解釋何為弗洛伊德演算法。有乙個送禮物的問題,是csdn上的乙個題目,題目的詳情是這樣的。hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外...

弗洛伊德演算法

floyd演算法詳解 求解任意兩點間的最短距離 floyd warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o n 3 我們平時所見的floyd演算法的一般形式如下 1void floyd 注意下第6行這個地方,如果dist i k 或者dist k j 不存...

弗洛伊德演算法

弗洛伊德演算法 求任意一點i到任意一點j的最短路。分析 求i到j的最短路,大可以使用群舉法,因為點都是離散的,i到j的路徑是有限的,所以一定可以通過群舉法得到最短路,但群舉法卻沒太大意義,他的意義在於 把群舉法 通過修改 進行分類,得到好的演算法。flod演算法的分類標準是 通過i到j過點的情況進行...