我想从图表中生成所有三元组。第一个“集合”中的所有三元组将分别为1,2,3和1,3,2和3,2,1。我对这组中的另一个三元组(即2,1,3或3,1,2)不感兴趣。我怎么能这样做?
答案 0 :(得分:4)
正如对问题的评论中所讨论的那样,目前还不是很清楚墓志铭的设置是什么,并且出于某种原因,他/她似乎不愿意澄清。但是我们假设“图形”实际上只是用距离矩阵表示(这可能是问题中数字和X的混乱应该显示的内容),每对顶点的实际数字距离。
在那种情况下,这里没有什么图形;每对顶点都有一条边,毫无例外;我们所能做的就是枚举顶点的每一个三元组。
对于三个顶点a,b,c的每个集,我们需要检查d(a,b)< = d(a,c)+ d(c,b),以及d(a,c)< = d(a,b)+ d(b,c),d(b,c)< = d(b,a)+ d(a,c)。所以,让我们这样做。以下是伪代码,因为如果我尝试用PHP编写它(尽可能少用它)我会犯错误。
for i from 0 to n_vertices-3
for j from i+1 to n_vertices-2
for k from j+1 to n_vertices-1
# now i,j,k are three distinct vertices, and every set of three vertices
# will occur once as we run through the loops.
a = distances[i,j]
b = distances[i,k]
c = distances[j,k]
if a>b+c or b>a+c or c>a+b
triangle inequality is violated; complain
如果您的图表以某种方式表示,而不是作为距离矩阵,或者如果许多边缘可能不存在,那么您需要做一些不同的事情。
(注意:如果您的图形应该满足三角形不等式,那么可以说它不应该丢失任何边缘,除非它实际上是断开的。这取决于距离是否是“从x到y的总体最短距离” “(在这种情况下,如果三角形不等式失败,则某些东西被破坏,并且连通图中应该没有缺失的边)或”直接路径从x到y的距离“(在这种情况下,如果三角形不等式失败,它只是表示据称直接路径不值得使用)。)