[英]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.