用于创建图形c ++的逻辑

时间:2016-11-25 02:12:22

标签: c++ graph

我正在开发一个项目,在这个项目中,我给出了一个权重为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;
    }

Example of the issues, the two halves are not connected

Full Graph

1 个答案:

答案 0 :(得分:1)

只需使用Kruskal算法使用的标准:如果图形不形成循环,则为图形添加边。要检查这一点,您必须检查两个事件节点是否连接到同一个连接组件。使用Union-Find数据结构可以有效地完成此操作。即无论何时添加边,都要将两个顶点的组件联合起来。在添加边缘之前,请检查两个组件是否相同。