C++ 如何在图中找到3条边的负加权循环?
我有一个有向图,大约有10000个节点。所有边都已加权。我想找到一个只包含3条边的负循环。有比O(n^3)更快的算法吗 示例代码:(g是我的图)C++ 如何在图中找到3条边的负加权循环?,c++,algorithm,matlab,graph,cycle,C++,Algorithm,Matlab,Graph,Cycle,我有一个有向图,大约有10000个节点。所有边都已加权。我想找到一个只包含3条边的负循环。有比O(n^3)更快的算法吗 示例代码:(g是我的图) if(DETAILS)std::printf(“长度3的计算循环”。\n”); 对于(int i=0;i,我想不出任何算法的确定共度低于O(n3),但常数因子在实践中也很重要。下面的算法允许修剪以加快查找长度为3且权重和为负数的循环-或检查是否不存在此类循环 根据边的权重对(定向)边进行排序 以重量最小的边作为起始边 尝试连接到起始边末端顶点且权重不低
if(DETAILS)std::printf(“长度3的计算循环”。\n”);
对于(int i=0;i,我想不出任何算法的确定共度低于O(n3),但常数因子在实践中也很重要。下面的算法允许修剪以加快查找长度为3且权重和为负数的循环-或检查是否不存在此类循环
根据边的权重对(定向)边进行排序
以重量最小的边作为起始边
尝试连接到起始边末端顶点且权重不低于起始边(第一次修剪)的所有边,并在关闭循环时检查权重之和。如果发现具有负和的循环,则完成操作
继续使用下一个最低权重的边作为起始边。如果其权重为负,则转到3-否则完成(第二次修剪)
其思想是,一个和为负的圆的至少一条边必须有一个负的权重。我们可以从循环中权重最低的边开始一个循环
如果您知道具有负权重的边数为O(n),那么该算法将为O(n2 ld n),因为该算法将由步骤1(=根据边的权重对边进行排序)控制。什么语言?如果有的话,您使用什么库?此外,您会问是否有比O(n^3)更快的算法算法,这意味着您已经有了一个:是否要添加到该算法的链接?@remo:如果边的数量是Ω(n²)
,我认为您做得比n³
@remo:边的数量限制是什么?我已经阅读了聊天讨论,但仍然不清楚是否确实有Ω(n²)
edges or not!此外,在聊天中,OP表示边是定向的,但他/她提供的代码只检查每条边的一个方向(定向三角形可以“定向”两种不同的方式)。非常感谢。这对我来说是一个很好的起点。{我如何再次查看聊天室?}@remo如果您单击问题下方的“显示更多评论”,您将看到相关链接。如果您只是在一般情况下寻找聊天,则页面顶部会有一个小链接。
if (DETAILS) std::printf ("Calculating cycle of length 3.\n");
for (int i=0;i<NObjects;i++)
{
for (int j=i+1;j<NObjects;j++)
{
for (int k=j+1;k<NObjects;k++)
{
if ((d= g[i][j]+g[j][k]+g[k][i])<0)
{
results[count][0] = i;
results[count][1] = j;
results[count][2] = k;
results[count][3] = d;
count++;
if (count>=MAX_OUTPUT_SIZE3)
goto finish3;
}
if ((d= g[i][k]+g[k][j]+g[j][i])<0)
{
results[count][0] = j;
results[count][1] = i;
results[count][2] = k;
results[count][3] = d;
count++;
if (count>=MAX_OUTPUT_SIZE3)
goto finish3;
}
}
}
}
finish3: