WEEK7 A TT的魔法貓

2021-10-05 03:30:28 字數 1346 閱讀 1753

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

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

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

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

input

第一行給出資料組數。

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

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

output

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

sample input

33 3

1 21 3

2 33 2

1 22 3

4 21 2

3 4sample output00

4思路:

本題用floyd演算法。

如果a能贏過b,那dis[a][b]=1,若b能勝過a那麼dis[b][a]=1;如果兩者為0,那麼說明a,b之間的勝負關係不確定。

用floyd演算法每一步進行的鬆弛操作為:dis[i][j]=max(dis[i][j],dis[i][k]&dis[k][j])。

還有就是本題需要剪枝,也就是在前兩層迴圈之後,如果dis[i][k]為0,那麼dis[i][k]&dis[k][j]為0,沒必要繼續判斷,dis[i][j]一定大於等於後者。

**

#include

#include

#include

#define maxn 510

using

namespace std;

int dis[maxn]

[maxn]

;int m,n;

void

floyed()

}}intmain()

floyed()

;int num=0;

for(

int i=

1;i<=n;i++

)for

(int j=i+

1;j<=n;j++)if

(dis[i]

[j]==

0&&dis[j]

[i]==0)

num++

; cout<}return0;

}

程式設計Week7 A TT的魔法貓

給定一張遊戲勝負表,上面有 n 個人以及 m 個勝負關係,每個勝負關係為 a b,表示 a 能勝過 b,且勝負關係具有傳遞性。即 a 勝過 b,b 勝過 c,則 a 也能勝過 c。求有多少選手的勝負關係不能 第一行給出資料組數。每組資料第一行給出 n 和 m n m 500 接下來 m 行,每行給出...

Week7 A TT 的魔法貓(Floyd)

問題描述 n個人玩乙個遊戲,每兩個人都要進行一場比賽。已知m個勝負關係,每個關係為a b,表示a比b強,勝負關係具有傳遞性。試問有多少場比賽的勝負無法預先得知?1 n,m 500 解題思路 1.勝負關係具有傳遞性,可以用floyd演算法求出任意兩點的勝負關係 傳遞閉包 2.d i j max d i...

week7 作業A TT的魔法貓

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