floyd 排序(傳遞閉包)

2021-10-02 08:18:38 字數 1421 閱讀 1700

給定 n 個變數和 m 個不等式。其中 n 小於等於26,變數分別用前 n 的大寫英文本母表示。

不等式之間具有傳遞性,即若 a>b 且 b>c ,則 a>c。

請從前往後遍歷每對關係,每次遍歷時判斷:

如果能夠確定全部關係且無矛盾,則結束迴圈,輸出確定的次序;

如果發生矛盾,則結束迴圈,輸出有矛盾;

如果迴圈結束時沒有發生上述兩種情況,則輸出無定解。

輸入格式

輸入包含多組測試資料。

每組測試資料,第一行包含兩個整數n和m。

接下來m行,每行包含乙個不等式,不等式全部為小於關係。

當輸入一行0 0時,表示輸入終止。

輸出格式

每組資料輸出乙個佔一行的結果。

結果可能為下列三種之一:

如果可以確定兩兩之間的關係,則輸出 「sorted sequence determined after t relations: yyy…y.」,其中』t』指迭代次數,'yyy…y』是指公升序排列的所有變數。

如果有矛盾,則輸出: 「inconsistency found after t relations.」,其中』t』指迭代次數。

如果沒有矛盾,且不能確定兩兩之間的關係,則輸出 「sorted sequence cannot be determined.」。

資料範圍

2≤n≤26,變數只可能為大寫字母a~z。

輸入樣例1:

4 6a傳遞閉包的問題,因為只有26個字母所以直接用floyd了,f[i][j]表示i小於j的話連乙個權值為1 的邊。 所以如果我們出現矛盾那麼f[i][i]=1,對於不能判斷的情況,那麼只要出現了一對點對f[i][j]和f[j][i]都等於0那麼他們關係就是沒辦法確定的。當我們能確定關係的時候因為要從小到達輸出,所以我們gei_min函式每次找出最小的數標記並輸出。

#include

using

namespace std;

const

int n =26;

int n, m;

bool g[n]

[n], d[n]

[n];

bool st[n]

;void

floyd()

intcheck()

char

get_min()

if(flag)}}

intmain()

}if(!type)

puts

("sorted sequence cannot be determined.");

else

if(type ==2)

printf

("inconsistency found after %d relations.\n"

, t)

;else

}return0;

}

floyd傳遞閉包

傳遞閉包 我第一反應是凸包emmm 就是把具有傳遞性的關係傳遞開。一般我們用一鄰接矩陣儲存。比如許多的並查集解決的問題,如果需要細緻 效率o n 可以用傳遞閉包去做。看一道題吧,poj1094,不等式的傳遞性。這道題在處理方面,d i,j 為1時表示i1 矛盾與不確定,優先矛盾。2 若加入了幾個,發...

floyd求傳遞閉包

n頭牛比賽,m種比賽結果,最後問你一共有多少頭牛的排名被確定了,其中如果a戰勝b,b戰勝c,則也可以說a戰勝c,即可以傳遞勝負。求能確定排名的牛的數目。思路 如果一頭牛被x頭牛打敗,打敗y頭牛,且x y n 1,則我們容易知道這頭牛的排名就被確定了,所以我們只要將任何兩頭牛的勝負關係確定了,在遍歷所...

Floyd演算法 求傳遞閉包

題目讓確定有幾個人的位置是確定的,如果乙個點有x個點能到達此點,從該點出發能到達y個點,若x y n 1 x y n 1 x y n 1,則該點的位置是確定的。用floyd演算法算出每兩個點之間的距離,最後統計時,若dis a b dis a b dis a b 之間無路且dis b a dis b...