我正在用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
的非空子集,请计算一个序列U = u1, u2, u3, ..., uo
,其中包含T
的所有元素,以便f(ui, uj) == false
为所有对于i < j
中的所有f(ui, s') == false
和i
,s'
和S - U
。您可以假设存在这样的序列。
虽然这与学校没有任何关系(这是为了工作),但我更喜欢最少的帮助让我找到你能想到的最佳解决方案,所以我可以了解更多:)
提示(我想过的一些东西:)
您需要至少访问一次每个节点。考虑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 }
要找到这一点,我们可以通过检查f(b, d)
,f(c, d)
和f(e, d)
并让它们全部为{{1}来进行3次检查,如果幸运的话}。
案例2:false
要找到这个,如果我们运气好的话,我们可以通过检查U = { a, b, c, d, e }
和f(b, d)
并让他们都返回f(a, e)
来进行2次检查。
(我完全没想过这些,但我需要去吃饭。感谢所有人的阅读!)
案例3:true
案例4:U = { a, b, c, d }
答案 0 :(得分:-1)
我所理解的是,您希望所有可以访问的节点从子集T中的任何节点开始...如果这是您的意思,您可以尝试这个...
您可以从t开始访问的节点子集是您在词典中标记的节点
希望它有所帮助...