floyd TT 的魔法貓

2021-10-23 03:33:07 字數 1303 閱讀 2145

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

本題中人與勝負關係可以構成乙個有向圖,a勝過b可以表示成a->b,因為a->b和b->a等價,所以只計算一次,並且勝負關係具有傳遞性,所以a->b與b->c可以得出a->c,這與路徑判斷兩點是否連通具有相同特點,因為每兩個人都可以進行比賽,所以想到了floyd演算法,在這裡每次更新時dis[i][j]表示(i,j)是否可判斷勝負,可以判斷為1,不可以則為0,這裡注意在鬆弛操作時,dis[i][j]=max(dis[i][j],dis[i][k]&dis[k][j]);。

這是一道floyd題目,用來求取圖中任意兩點之間的關係,是傳遞閉包問題,即任意兩點之間的連通關係。

演算法複雜度是o(n^3),所以再利用演算法時常需要剪枝,根據判斷dis[x][y]的值去掉多餘的更新操作。

//floyd

//求取圖中任意兩點之間的關係 //任意兩點 即關係為n^2 n(n-1)/2

/*void floyd(int n,int **dis)

}}*/

//題目

//一共n(n-1)/2

#include

#include

#include

using

namespace std;

int dis[

510]

[510];

int count;

void

floyd

(int n,

int dis[

510]

[510])

//兩點之間不斷更新 }}

}}intmain()

floyd

(n,dis)

; cout<(n-1)/

2-count<}}

TT的魔法貓 Floyd演算法

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

WEEK7 A TT的魔法貓

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

week7 A Floyd TT的魔法貓

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