我需要找到一种算法,该算法可以针对G(V,E)图中的每个边缘查找是否在每个mst,一个mst但不是全部或根本没有mst中插入。我考虑过修改kruskal的算法因此,每次使用find()是否要处理的边形成一个循环,请检查所形成的循环中是否还有另一个权重相同的边。如果同时使用这两个边,则不是所有边都使用。处理不会形成一个周期,将其添加到mst并将其标记为每个mst中包含的周期(不过稍后可能会更改)。
要执行此操作,如果在find()函数之后检测到一个循环,则调用第二次查找,以权重= W处理的边在哪里检查此循环中是否有权重= W的其他边。 最初,我是这样声明我的图的
int V = 4; // Number of vertices in graph
int E = 5; // Number of edges in graph
struct Graph* graph = createGraph(V, E);
// add edge 0-1
graph->edge[0].src = 0;
graph->edge[0].dest = 1;
graph->edge[0].weight = 10;
// add edge 0-2
graph->edge[1].src = 0;
graph->edge[1].dest = 2;
graph->edge[1].weight = 6;
// add edge 0-3
graph->edge[2].src = 0;
graph->edge[2].dest = 3;
graph->edge[2].weight = 5;
// add edge 1-3
graph->edge[3].src = 1;
graph->edge[3].dest = 3;
graph->edge[3].weight = 15;
// add edge 2-3
graph->edge[4].src = 2;
graph->edge[4].dest = 3;
graph->edge[4].weight = 4;
第一个find()函数是:
int find(struct subset subsets[], int i)
{
// find root and make root as parent of i
// (path compression)
if (subsets[i].parent != i)
subsets[i].parent = find(subsets, subsets[i].parent);
return subsets[i].parent;
}
所以我的问题是,在第二个发现中有一个顶点且它是父对象(假设0-> 3),我如何找到和使用该边缘的权重?