//普利姆演算法 最小生成樹
/*把所有頂點分為 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 ...