Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有向图顶点子集的拓扑排序_C#_Algorithm_Graph Theory_Directed Graph_Directed Acyclic Graphs - Fatal编程技术网

C# 有向图顶点子集的拓扑排序

C# 有向图顶点子集的拓扑排序,c#,algorithm,graph-theory,directed-graph,directed-acyclic-graphs,C#,Algorithm,Graph Theory,Directed Graph,Directed Acyclic Graphs,我正在用C4.0编写一个程序,我将其抽象为以下内容:我提到该语言,以便您知道我必须使用哪些库;没有第三方库: 设S={s1,s2,s3,…,sn} 对于所有的si,sj,S,i!=j、 函数fsi,sj是{true,false}的一个元素。调用这个函数f非常昂贵,但是应该尽可能少地调用 给定集合T={t1,t2,t3,…,tm}一个S的非空子集,计算一个序列U=u1,u2,u3,…,uo,它包含T的所有元素,使得fui,uj==false表示所有ib a->c a->f b->e b->h。。。

我正在用C4.0编写一个程序,我将其抽象为以下内容:我提到该语言,以便您知道我必须使用哪些库;没有第三方库:

设S={s1,s2,s3,…,sn}

对于所有的si,sj,S,i!=j、 函数fsi,sj是{true,false}的一个元素。调用这个函数f非常昂贵,但是应该尽可能少地调用

给定集合T={t1,t2,t3,…,tm}一个S的非空子集,计算一个序列U=u1,u2,u3,…,uo,它包含T的所有元素,使得fui,uj==false表示所有i 虽然这与学校没有任何关系,但这是为了工作,我更愿意得到最少的帮助,让我找到你能想到的最佳解决方案,这样我就能学到更多:

提示我考虑过的一些事情:

您需要至少访问每个节点一次。考虑T={t}和FT的情况,S′=假为S’t中的所有S’,并且s 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已经在集合中,所以是否有人依赖它们并不重要,因此-

由于对称性,fa,d,fa,e,fb,d,fb,e,fc,d,fc,e都是相等的候选者。假设我们选择fa,d,它返回false。我们的表现在如下所示:

     a  b  c  d  e
   ----------------
*a | -  -  -  0  ?
*b | -  -  -  ?  ?
*c | -  -  -  ?  ?
 d | -  -  -  -  ?
 e | -  -  -  ?  -
案例1:U={a,b,c}

为了找出这个问题,如果我们运气好的话,我们可以分三次检查,检查fb,d,fc,d和fe,d,让它们都是假的

案例2:U={a,b,c,d,e}

为了找到答案,我们可以在两次检查中完成,如果幸运的话,通过检查fb、d和fa、e,让它们都返回true

我还没有完全想清楚这些,我需要去吃点东西。谢谢大家的阅读

案例3:U={a,b,c,d}


案例4:U={a,b,c,e}

我的理解是,您希望从子集T中的任何节点开始访问所有节点。。。如果这是你的意思,你可以试试这个

将所有节点填充到字典中,其中节点为键,访问的布尔值为值。将此值起始为false 在添加节点时,用子集T中的节点填充队列在字典中搜索它们,并将它们标记为已访问 选择队列检查中的第一个元素,您可以从中访问哪些节点,如果已访问,则在字典中搜索;如果已访问,则跳过;如果未访问,则将其添加到队列并将其设置为已访问,删除队列的第一个元素 重复3,直到队列中没有项目为止 您可以从t开始访问的节点子集就是您在字典中标记的节点


希望它能帮上忙…

看起来像BFS?问题在于这一步:选择队列检查中的第一个元素,从中可以访问哪些节点。开始时,我必须对照所有其他节点检查此节点。我不知道,一开始,给定一个节点,它的所有邻居。这是我需要计算的。也许,如果这是一个图,我假设你不仅有节点,你也有连接,你将搜索从节点X开始的连接,并添加这些连接的所有端点,按节点排序将有帮助,或者,再次使用字典,以起始节点为键,以所有结束节点的数组为值,如下连接a->b a->c a->f b->e b->h。。。。制作一个这样的字典[key:a,value:{b,c,f}],[key:b,value:{e,h}]…@saul672您似乎没有解决这个问题,请尽可能少地检查问题的节点依赖性部分。OP还没有图形结构;查找边的代价很高。对不起,我刚刚意识到我的错误我应该在队列检查中选择第一个元素,从中可以访问节点,对不起我的英语,这种情况发生在我身上。我不明白为什么有人会将此标记为非真问题…?是的,我也不知道。我现在正在写一个例子。我猜是同一个人投了反对票,索尔也投了反对票/我重新添加了关于U的元素不依赖于S中不在U中的任何元素的条件,因为这似乎已经在你的重新措辞中丢失了。还有一个问题:f是可传递的吗?好的。我将继续考虑这个问题,因为我认为这很有趣,但我并不太乐观,因为你可以保存太多的f的计算;至少,您需要检查每个编号中的f
在S-U o n-o检查中,将U中的每个节点删除,可能还会将U中的每个元素删除到其后续的o-1/2检查中,以获得on-o^2/2-o/2下限。我并不是想认为您的解决方案在正确性方面无效。它只是看起来可能有一个更好的运行时间来完成它。我可能错了。