最小生成樹 普里姆演算法

2021-08-17 14:41:13 字數 3542 閱讀 5920

//普利姆演算法 最小生成樹

/*把所有頂點分為 2 個集合 ,乙個表示已經選中的頂點集合 另乙個表示未選中的頂點集合

例如 a,b,c,d,e 五個頂點

1.任意選擇乙個頂點 放在 已經選中的頂點集合中 假如 選a

2.將a  與未選中頂點集合中 選擇 一頂點 條件 權值最小的乙個頂點 如何權值相同 則任意選擇乙個最小的

3.將上輪選中的頂點 重複2 直到所有頂點選擇完畢

*/#include

#include

#include

#include

using namespace std;

#define maxsize 512

#define invalid -1

struct basenode

int tailindex;//弧尾 下標

int nweight; //權值

basenode * next;

};struct graphnode

;struct arcinfo

bool operator==(int i)

int headindex;

int tailindex;

int nweight;

};class graph

bool init(bool bodirection);

basenode * insertnode(basenode * curnode,int tailindex, int nweight);

void print();

void depth();

void depthsearch(int index);

void breadth();

void breadthsearch(int index);

bool makeminispantree();

void selectpoint(int i, vector&selectpoint, vector&noselectpoint, vector&selectarc,vector&templist);

public:

graphnode *m_allnode;

int m_edgenum;                //邊數

int m_vertexnum;            //頂點數

bool  m_bodirection;        //有向 無向

};basenode * graph::insertnode(basenode * curnode, int tailindex, int nweight)

basenode *t = new basenode;

if (t == null)

if ((t)->tailindex > m_vertexnum)

(t)->tailindex = tailindex;

(t)->nweight = nweight;

curnode->next = t;

return t;

}bool graph::init(bool bodirection)

m_allnode = new graphnode[m_vertexnum+1];

for (int i = 1; i <= m_vertexnum; i++)

cout << "請輸入邊數" << endl;

cin >> m_edgenum;

if (m_edgenum > (m_vertexnum - 1)*m_vertexnum / 2 || m_edgenum <= 0 || m_edgenum >= maxsize)

delete m_allnode;

m_allnode = null;

return false;

}cout << "請輸入邊的資訊" << endl;

for (int i = 0; i < m_edgenum; i++)

insertnode(alast, b, c);

if (!bodirection)

insertnode(blast, a, c);}}

else

}return true;

}void graph::print()

cout << "訪問" << m_allnode[i].mindex << "結束" << endl;}}

//深度優先遍歷

void graph::depth()

for (int i = 0; i <= m_vertexnum; i++)

}void  graph::depthsearch(int index)

cout << "訪問" << index << endl;

m_allnode[index].bvisit = true;

basenode * t = m_allnode[index].first->next;

while (t)

}dequetqueue;

void graph::breadth()

for (int i = 0; i <= m_vertexnum; i++)

}void graph::breadthsearch(int index)

cout << "訪問" << index << endl;

m_allnode[index].bvisit = true;

basenode * t = m_allnode[index].first->next;

while (t)

t = t->next;

}while (tqueue.size() > 0)

}bool graph::makeminispantree()

for (int i = 1; i <= m_vertexnum; i++)

cout << "開始輸出最小生成樹的弧資訊" << endl;

for (int i = 0; i < selectarc.size(); i++)

cout << "結束" << endl <&selectpoint, vector&noselectpoint, vector&selectarc,vector&templist)

if (templist.size() > 0)

}templist.erase(templist.begin()+p);

selectpoint.push_back(index);

vector::iterator it = find(noselectpoint.begin(), noselectpoint.end(), index);

if (it != noselectpoint.end())

selectarc.push_back(min);

if (noselectpoint.size() > 1)

else if (noselectpoint.size() == 1 && noselectpoint[0] == min.tailindex)

cout << "最小生成樹 生成成功" << endl;}}

}}int main()

}return 0;

}

最小生成樹(普里姆演算法)

關於什麼是prim 普里姆演算法 在實際生活中,我們常常碰到類似這種一類問題 如果要在n個城市之間建立通訊聯絡網,則連通n個城市僅僅須要n 1條線路。這時。我們須要考慮這樣乙個問題。怎樣在最節省經費前提 下建立這個通訊網.換句話說,我們須要在這n個城市中找出乙個包括全部城市的連通子圖,使得 其全部邊...

最小生成樹 普里姆演算法

當我們要求解n個連線城市之間的路線問題,就需要我們進行乙個計算。而在連通網上面,我們稱這類問題為最小代價生成樹 最小生成樹 問題。今天我們主要討論的是用普里姆演算法實現最小生成樹。如圖所示,a圖是乙個有權值的連通圖。要對其進行最小生成樹求解,假設初始點為v1,尋找與1有關係而且權值最小的頂點 圖源嚴...

普里姆演算法 最小生成樹

include includeusing namespace std 普里姆演算法求最小生成樹 先取一點,然後求其周圍各點最近的,將其納入最小生成樹裡面,再在生成最小生成樹周圍求最近的,之後再納入,這樣不斷遍歷每個節點 void minispantree prim mgraph g for int ...