好的,所以这个图必须用最小数量来实现 信号量,我想知道什么时候边缘被认为是多余的,应该是 删除,在我的例子中,(2)到(5)的边缘可以被认为是多余的(为什么) 我还必须指定图形不是循环的,你不能使用cobegin-coend构造
所以我的困境围绕着多余的边缘,因为这会改变我的解决方案,直到现在我想 (2) - (5)可以保留,我按顺序划分信号量:
s1 (from 1 to 2 , 3 and 5)
s2 (from 2 and 3 to 4)
s3 (from 1 , 2 and 3 to 5)
s4 (from 3 , 4 and 5 to 6)
@karmastan 考虑信号量原语signal()和wait()并考虑这个图(1) - s1 - >(2)因此到达(2)你应该在(1)的边缘使用信号量“s1”到(2)你必须先执行(1)所以代码就像
1 : 2:
do (1) wait(s1) //waits for the signal from 1
signal(s1)//1 has finished do (2)
@让 - 伯纳德 我理解,所以如果我在这个例子中得到了正确的概念,其中“虚线”边缘 在互斥中被考虑(除了通常的信号量工具之外还有互斥)
因此
我应该删除:
(1)---->(6) //because it's a "cross" edge
(3)---->(6) // also because it's a "cross" and excludes (3)--->(5)
然后我会有6个信号量和一个互斥量
s1 (from 1 to 2)
s2 (from 1 to 3)
s3 (from 1 to 4)
s4 (from 2 and 3 to 5)
s5 (from 4 and 5 to 6)
s6 (from 6 to 1)
mutex(between 2 and 4)
答案 0 :(得分:1)
1 - > 2和3
2和3 - > 4和5
4和5 - > 6
最长的路径是3,因此它应该可以用3个信号量来实现 顶点应该是对应于源的最长路径的信号量的结果。而先决条件应该是通向最长路径的结果的边缘。
上述措辞令人困惑,但这意味着1-> 5被删除,因为该边缘是1级边缘(来自源),但5是2级节点(具有最大路径)从源头到它的长度2)。相同的过程消除了3-> 6。
您无法消除2-> 5,因为它是通向2级节点的2级路径。如果它是1级路径,或5是3级节点,那么你可以因为其他信号量已经处理了5的先决条件。
考虑从2> 1和6-> 3添加边缘的图表。 (这意味着您可以执行1次,然后需要2次才能重复1次,同样适用于3次和6次。)
1,然后在第2级显示为结果,因为通向2的最长路径是长度2:不需要额外的信号量为2> 1
注意:这并不意味着1作为3级的先决条件出现,这符合我给出的定义,但前面的示例与结果有匹配的先决条件,这只是巧合,所以我想我指出来。
现在您还需要考虑6-> 1的路径。此路径的长度为4,并且尚未进行探索。所以它需要一个额外的信号量,因为它意味着我们有一个第四级。第4级只是6-> 1的信号量,因为这是唯一未探索的长度为4的路径。遍历边缘后,您可以从该点开始忽略它。
因此,使图形循环不会使它变得更难。事情仍处于“水平”状态,不能作为多个级别的结果或先决条件出现。我们之前不需要考虑的唯一事情是,一旦遍历了边缘就忽略它,这就避免了带有循环图的无限循环,而以前就没有必要了。
答案 1 :(得分:0)
我在抓住你的确切含义时遇到了一些麻烦,但我认为你想要的很大一部分是topological sorting。