Week7 作業 A TT 的魔法貓

2021-10-23 02:22:33 字數 1764 閱讀 1974

眾所周知,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) 等價,即每乙個二元組只被計算一次。

1、分析題目可知該題為乙個求傳遞閉包的問題,可以使用

step0 對每組資料,定義乙個bool陣列dis[501][501]存放大小關係,將輸入的大小關係錄入到dis陣列中(dis[a][b]=1)

step1 呼叫floyd函式,對某一k,若dis[i][j]=0,且dis[i][k]=1&&dis[k][j]=1,則將dis[i][j]賦為1。

step2 遍歷dis陣列,計算所有無法確定大小的陣列對。

1、如果直接按照floyd演算法做而不進行剪枝,會造成te的錯誤,所以需要在floyd演算法中,當對與某一k下,若dis[i][k]==0或dis[i][j]==1或dis[k][j]==0的情況均不需繼續計算,而是直接使用continue語句跳到下乙個迴圈。

2、函式的引數為bool** dis時無法將dis[501][501]傳入,所以考慮將引數直接換成確定大小的陣列。

3、對每乙個k計算dis[i][j],只需要考慮dis[i][k]和dis[k][j]是否全為1,不用考慮dis[k][i]和dis[j][k],因為這個在計算dis[j][i]時考慮了。

4、計算有多少對不確定時,dis[i][j]和dis[j][i]全為0時計算一次

#include

using

namespace std;

void

floyd

(int n,

bool dis[

501]

[501])

//bool** dis 無法將第二維確定的二維陣列傳入。}}

intmain()

;scanf

("%d%d"

,&n,

&m);

for(

int i=

0;i)floyd

(n,dis)

;int count=0;

for(

int i=

1;i<=n;i++

)for

(int j=i+

1;j<=n;j++

)/* for(int i=0;i<=n;i++)

return0;

}

week7 作業A TT的魔法貓

眾所周知,tt 有乙隻魔法貓。這一天,tt 正在專心致志地玩 貓和老鼠 遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝...

Week7 作業A TT的魔法貓

眾所周知,tt 有乙隻魔法貓。這一天,tt 正在專心致志地玩 貓和老鼠 遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝...

WEEK7 A TT的魔法貓

眾所周知,tt 有乙隻魔法貓。這一天,tt 正在專心致志地玩 貓和老鼠 遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝...