我正在用C#4.0編寫一個程序,我已經抽象出以下內容(我提及語言,以便您知道我必須使用哪些庫;沒有第三方庫) :拓撲排序的有向圖頂點的子集
讓S = { s1, s2, s3, ..., sn }
。
對於所有si
,sj
在S
,i != j
,功能f(si, sj)
是{ true, false }
的元件。調用這個函數f
是相當昂貴的,但是應該儘可能少地完成。
組給定的T = { t1, t2, t3, ..., tm }
S
一個非空的子集,計算其中含有的T
使得f(ui, uj) == false
所有元素用於所有i < j
序列U = u1, u2, u3, ..., uo
,和f(ui, s') == false
用於S - U
所有i
和s'
。你可能會認爲這樣的序列存在。
雖然這是沒有辦法的相關學校(它的工作),我喜歡的幫助最少讓我到你能想到的最優化的解決方案,讓我可以瞭解更多:)
提示(一些東西,我已經想過:)
您需要訪問的每個節點至少一次。考慮
T = { t }
和f(t, s') == false
的情況,對於所有s'
的S - T
和|S| >= 2
。一旦在這種情況下也是足夠的。必須計算最小
U
。這種計算可以通過以下表示:與?
項進行|S|x|S|
鄰接矩陣:我不知道1
:要看。0
:不依賴於。-
:我不在乎。
考慮這個(我走自己通過一個實例來看看是否有到最佳電位檢查序列的模式,以幫助開發的算法)。 S = { a, b, c, d, e }
T = { a, b, c }
(由星表示):
a b c d e
----------------
*a | - - - ? ?
*b | - - - ? ?
*c | - - - ? ?
d | - - - - ?
e | - - - ? -
U = { a, b, c }
最初。對角線爲-
,因爲f
在其操作數相等時未定義。由於a
,b
和c
已經在集合中,所以任何人都依賴它們並不重要,因此-
。
f(a, d)
,f(a, e)
,f(b, d)
,f(b, e)
,f(c, d)
,f(c, e)
是由於對稱性全部相等的候選人。假設我們選擇f(a, d)
並且它返回false。我們的餐桌現在看起來是這樣的:
a b c d e
----------------
*a | - - - 0 ?
*b | - - - ? ?
*c | - - - ? ?
d | - - - - ?
e | - - - ? -
案例1:U = { a, b, c }
要了解這一點,我們能做到這一點在3次檢查,如果我們很幸運,通過檢查f(b, d)
,f(c, d)
和f(e, d)
和有他們都是false
。
案例2:U = { a, b, c, d, e }
要了解這一點,我們能做到這一點在2次檢查,如果我們很幸運,通過檢查f(b, d)
和f(a, e)
,並讓他們都返回true
。
(我還沒有想到過這些,完全的,但,我需要去吃飯感謝大家閱讀!)
案例3:U = { a, b, c, d }
案例4:U = { a, b, c, e }
我不明白爲什麼有人會將此作爲不是一個真正的問題...? – Dougal 2012-08-16 20:18:40
是的,我也不知道。我正在寫一個例子。 (我認爲同一個人低估了它和Saul。)/ – 2012-08-16 20:22:22
我重新添加了關於'U'的元素的條件,而不依賴於'S'中不屬於'U'的任何元素,因爲這似乎有在你的改語中失去了。另外,一個問題:是'f'傳遞? – Dougal 2012-08-16 21:48:42