如何在图中找到3个边缘的负加权周期
How can I find a negative weighted cycle of 3 edges in a graph?
我有一个有向图的图形,约有10,000个节点。所有边缘均加权。我想找到一个仅包含3个边缘的负周期。是否有比O(n^3)更快的算法?
示例代码:( G是我的图)
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:
我无法想到任何比O(N 3 )的明确组合性的算法,但是在实践中,恒定因素也很重要。以下算法允许修剪以速度查找具有负重总和的长度3的循环 - 或检查没有这样的周期。
- 根据其重量对(定向)边缘进行排序
- 作为起始边缘的重量最低的边缘。
- 尝试连接到起始边缘的末端顶点的所有边缘,重量不低于起始边缘(第一修剪),并在关闭周期时检查权重总和。如果您找到一个负和负数的周期,则完成了。
- 继续以最低重量作为起始边缘的边缘。如果其重量为负3-否则您完成(第二修剪)
的想法是,至少一个具有负和总和的cylce的边缘必须具有负重量。并且我们可以在周期中以最低的重量开始一个周期。
如果您知道负重的数字边缘为o(n),则该算法将为O(n 2 ld n),因为算法将由步骤1(=分类)主导边缘根据其重量)。
相关文章:
- 如何获取边缘窗口句柄 (HWND)?
- 提升如何在图形可视化中写入边缘的权重?
- 在 c++ 中使用 Tensorflow Lite 在边缘 TPU 上运行"mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite"时出现问题
- 分数背包边缘箱
- 应用程序无法找到铬边缘浏览器
- 一种有效的数据结构,用于按 ID 访问和查找加权随机项
- 创建有向加权图
- SFML C++ Canny边缘检测双刃
- 难以使球从屏幕边缘反弹
- 我的精灵使用名为 ASGE 的C++框架卡在屏幕边缘
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 无法在 vtk 中重新着色边缘
- 如何使用提升make_label_writer写入边缘属性?
- 使用 epoll 边缘触发器的套接字上的数据过多
- 加权外积的矢量化
- 计算无向未加权图的每个连接部分中的节点数
- 通过将文本文件读取为字符串/向量来计算加权/未加权 GPA
- 迭代提升反向图中的边缘
- 如何在提升图中访问边缘信息?
- 如何在图中找到3个边缘的负加权周期