我正在开发一个项目,在这个项目中,我给出了一个权重为A或B的边列表。我最终需要确定是否可以创建一个带有'x'个A边的生成树。
现在我正在尝试创建用于创建最小生成树的所有边的列表,并通过创建我使用的顶点列表来实现。如果已经使用了两个顶点,则丢弃该边缘。我遇到的问题是,一旦我到达结束我的图表,我经常留下两半没有连接的图形,因为已经使用了连接两半的边缘。有关如何解决这个问题的想法,还是整体方法错了?
struct Edge{
int start;
int end;
char letter;
bool used;
};
void PrimWhite(...)
{
vector<int> usedVertices;
int count,maxNum,begin,end;
int totalVertexs = 0;
maxNum = whiteEdge.size();
Edge temp;
Edge *point = &temp;
Edge *usedorNah;
for (count = 0;count < maxNum; count++)
{
temp = whiteEdge[count];
usedorNah = &whiteEdge[count];
begin = point->start;
end = point->end;
if ( (find(usedVertices.begin(), usedVertices.end(), begin) == usedVertices.end()) && (find(usedVertices.begin(), usedVertices.end(), end) == usedVertices.end()))
{
usedVertices.push_back(begin);
usedVertices.push_back(end);
totalVertexs = totalVertexs + 2;
usedorNah->used = true;
}
else if ((find(usedVertices.begin(), usedVertices.end(), begin) == usedVertices.end()) && (find(usedVertices.begin(), usedVertices.end(), end) != usedVertices.end()))
{
usedVertices.push_back(begin);
totalVertexs++;
usedorNah->used = true;
}
else if ((find(usedVertices.begin(), usedVertices.end(), begin) != usedVertices.end()) && (find(usedVertices.begin(), usedVertices.end(), end) == usedVertices.end()) )
{
usedVertices.push_back(end);
totalVertexs++;
usedorNah->used = true;
}
答案 0 :(得分:1)
只需使用Kruskal算法使用的标准:如果图形不形成循环,则为图形添加边。要检查这一点,您必须检查两个事件节点是否连接到同一个连接组件。使用Union-Find数据结构可以有效地完成此操作。即无论何时添加边,都要将两个顶点的组件联合起来。在添加边缘之前,请检查两个组件是否相同。