floyd演算法 比賽未知情況場數計算

2021-10-04 19:26:37 字數 1451 閱讀 3176

眾所周知,tt 有乙隻魔法貓。

這一天,tt 正在專心致志地玩《貓和老鼠》遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?

魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝負關係,每個勝負關係為 a b,表示 a 能勝過 b,且勝負關係具有傳遞性。即 a 勝過 b,b 勝過 c,則 a 也能勝過 c。

tt 不相信他的小貓咪什麼比賽都能**,因此他想知道有多少對選手的勝負無法預先得知,你能幫幫他嗎?

【輸入】

第一行給出資料組數。

每組資料第一行給出 n 和 m(n , m <= 500)。

接下來 m 行,每行給出 a b,表示 a 可以勝過 b。

【輸出】

對於每一組資料,判斷有多少場比賽的勝負不能預先得知。注意 (a, b) 與 (b, a) 等價,即每乙個二元組只被計算一次。

【樣例輸入】

33 3

1 21 3

2 33 2

1 22 3

4 21 2

3 4【樣例輸出】00

4因為勝負關係具有傳遞性,因此可以用 floyd 演算法求出

任意兩點的勝負關係(傳遞閉包),即可求出答案

• dis[a][b] = 1 表示 a 比 b 強

• dis[a][b]= 0 表示 a 與 b 的勝負關係不明

• dis[a][b] = 0 且 dis[b][a]= 0 即表示 a 與 b 的勝負關係無法預先判斷,因為題目中給出的a,b關係不一定全都在上三角矩陣或下三角矩陣。

最後在表示勝負關係的矩陣中,統計 滿足dis[a][b] = 0 且 dis[b][a]= 0的點的組數,即為勝負關係不明確的局數。

1、剪枝

三次迴圈可能導致超時,在設計floyd演算法時,加入判斷條件進行剪枝if(dis[i][k]!=0)

2、在給出a和b關係時不僅使dis[a][b]=1同時使dis[b][a]=1,最後只判斷上三角矩陣的情況是錯誤的,閉包出現問題

#include

#include

using

namespace std;

int p,n,m,a,b;

int dis[

510]

[510];

void

floyd()

}}intmain()

floyd()

;for

(int k=

1;k<=n;k++

)for

(int j=k+

1;j<=n;j++

)//對角線元素

if(dis[k]

[j]==

0&&dis[j]

[k]==0)

//報錯點 ????

cout<}}

C 資料個數未知情況下的輸入方法

我們經常需要輸入一串數,而資料個數未知。這時候就不能以資料個數作為輸入是否結束的判斷標準了。這種情況下,我們可以用以下兩種方法輸入資料。1 以整數為例 2 include 3 include 4 include 5 using namespace std 67 intmain 15 輸出16 for...

Floyd演算法思想

本來 量如此小的演算法不用出模板了,但是的確思想還是很好的。1.定義概覽 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshal...

Floyd演算法簡介

演算法定義 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n 3 空間複雜度為o n2 演算法...