眾所周知,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) 等價,即每乙個二元組只被計算一次。
【樣例輸入】
33 3
1 21 3
2 33 2
1 22 3
4 21 2
3 4【樣例輸出】00
4因為勝負關係具有傳遞性,因此可以用 floyd 演算法求出
任意兩點的勝負關係(傳遞閉包),即可求出答案
• dis[a][b] = 1 表示 a 比 b 強
• dis[a][b]= 0 表示 a 與 b 的勝負關係不明
• dis[a][b] = 0 且 dis[b][a]= 0 即表示 a 與 b 的勝負關係無法預先判斷,因為題目中給出的a,b關係不一定全都在上三角矩陣或下三角矩陣。
最後在表示勝負關係的矩陣中,統計 滿足dis[a][b] = 0 且 dis[b][a]= 0的點的組數,即為勝負關係不明確的局數。
1、剪枝
三次迴圈可能導致超時,在設計floyd演算法時,加入判斷條件進行剪枝if(dis[i][k]!=0)
2、在給出a和b關係時不僅使dis[a][b]=1同時使dis[b][a]=1,最後只判斷上三角矩陣的情況是錯誤的,閉包出現問題
#include
#include
using
namespace std;
int p,n,m,a,b;
int dis[
510]
[510];
void
floyd()
}}intmain()
floyd()
;for
(int k=
1;k<=n;k++
)for
(int j=k+
1;j<=n;j++
)//對角線元素
if(dis[k]
[j]==
0&&dis[j]
[k]==0)
//報錯點 ????
cout<}}
C 資料個數未知情況下的輸入方法
我們經常需要輸入一串數,而資料個數未知。這時候就不能以資料個數作為輸入是否結束的判斷標準了。這種情況下,我們可以用以下兩種方法輸入資料。1 以整數為例 2 include 3 include 4 include 5 using namespace std 67 intmain 15 輸出16 for...
Floyd演算法思想
本來 量如此小的演算法不用出模板了,但是的確思想還是很好的。1.定義概覽 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshal...
Floyd演算法簡介
演算法定義 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n 3 空間複雜度為o n2 演算法...