眾所周知,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。
sample input
333
1213
2332
1223
4212
34
對於每一組資料,判斷有多少場比賽的勝負不能預先得知。注意 (a, b) 與 (b, a) 等價,即每乙個二元組只被計算一次。
sample output
0
04
基本原理:floyd-warshall
用途求取圖中任意兩點之間的距離
過程假設任意兩點之間不允許經過任一點,則此時兩點之間的最短距離即為兩點連線,若無連線則為無窮遠。
此時兩點之間若允許通過點1,則任意兩點x,y之間最短距離如果改變,必然是因為1的引入引起的,此時最短距離為min(f(x,y),f(x,1)+f(1,y));
以此類推直到允許通過的點為1~n(所有點),則此時得到的最短距離必為任意兩點之間的最短距離。
**模板
void
floyd
(int n,
int*
*dis)
本題應用
本題中,除了給定的勝負關係之外,重點是應用勝負關係的傳遞性來求得任意兩點之間的勝負關係,這時便可對上述floyd演算法進行一些改動進行求解。
首先將選手想象成圖中的點,將a戰勝b轉化為ab兩點之間的有向邊,邊長為1。將模板中對任意兩點之間有向邊的更新改為dis[i][j]=max(dis[i][j],dis[i][k]&dis[k][j]),這樣當演算法結束後,便考慮了所有點作為中間點對勝負關係的傳遞,即得到了所有勝負關係,若dis[i][j]與dis[j][i]均為零,則表示勝負不明,否則,勝負關係已明確。
1.兩點之間的勝負關係必須想象為有向邊,若想象成無向邊,會出現勝關係與負關係進行傳遞的情況,使得一些本來勝負關係不明的點標記為已知關係(如:a勝b,b負c,a與c的勝負關係並不明確)。
2.若直接套用模板會出現超時的情況,需進行一定的剪枝,若dis[i][k]為0,則一定不會對d[i][j]進行更新,此時可直接進行一下層迴圈。
#include
#include
using
namespace std;
const
int size=
500+5;
int a[size]
[size]
;int
main
(int argc,
char
** ar**)
for(
int k=
1;k<=n;k++
)for
(int x=
1;x<=n;x++)}
}int count=0;
for(
int x=
1;x<=n;x++
)for
(int y=
1;y(a[x]
[y]==
0&&a[y]
[x]==0)
count++
;printf
("%d\n"
,count);}
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 個勝...