簡體   English   中英

創建圖形C ++的邏輯

[英]Logic for creating graph c++

我正在一個項目中,給我一個權重為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;
    }

問題的示例,兩個半部未連接

全圖

只需使用Kruskal算法使用的標准即可:如果沒有形成循環,請在圖形上添加一條邊。 要對此進行檢查,您必須檢查兩個入射節點是否連接到相同的連接組件。 使用聯合查找數據結構可以有效地完成此操作。 即,每當您添加一條邊時,就將兩個頂點的成分合並在一起。 在添加邊之前,請檢查兩個組件是否相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM