眾所周知,tt 有乙隻魔法貓。input這一天,tt 正在專心致志地玩《貓和老鼠》遊戲,然而比賽還沒開始,聰明的魔法貓便告訴了 tt 比賽的最終結果。tt 非常詫異,不僅詫異於他的小貓咪居然會說話,更詫異於這可愛的小不點為何有如此魔力?
魔法貓告訴 tt,它其實擁有一張遊戲勝負表,上面有 n 個人以及 m 個勝負關係,每個勝負關係為 a b,表示 a 能勝過 b,且勝負關係具有傳遞性。即 a 勝過 b,b 勝過 c,則 a 也能勝過 c。
tt 不相信他的小貓咪什麼比賽都能**,因此他想知道有多少對選手的勝負無法預先得知,你能幫幫他嗎?
第一行給出資料組數。output每組資料第一行給出 n 和 m(n , m <= 500)。
接下來 m 行,每行給出 a b,表示 a 可以勝過 b。
對於每一組資料,判斷有多少場比賽的勝負不能預先得知。注意 (a, b) 與 (b, a) 等價,即每乙個二元組只被計算一次。sample input
3sample output3 31 2
1 32 3
3 21 2
2 34 2
1 23 4
004我的思路:
這道題是要求是給出一些勝負關係,然後判斷最後有多少對選手的勝負無法預先得知。可以了利用弗洛伊德演算法,計算傳遞閉包(即將勝負關係確定的做標註),這裡要做一定的優化,在第二層迴圈的時候,即判斷兩段距離中的第一段是否可以預知勝負,若不可以則直接跳出本次迴圈,因為接下來判斷的結果是一定的,不會更改之前的結果。
我的總結:
對於一些時間複雜度高的樸素演算法,可以根據題意進行一定的優化,便可以達到很好的效果。
我的**:
#include
using
namespace std;
int rel[
501]
[501
],a,b,n,n,m,ans;
void
init()
void
floyd()
}}intmain()
floyd()
;for
(int i=
1;i1;i++)}
cout<}}
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 個勝...