顧名思義,這是用來解決聯通圖中,遍歷所有的點,花費權值之和最小的演算法
解決問題有兩種方法,第乙個是遍歷所有的邊,第二個是遍歷所有的點
kruscal演算法
總的思想其實很容易理解,對於連通圖來說,最小的邊一定屬於最小生成樹,這裡就不給證明了,是用反證法求證。
所以得到了所有的邊之後,對結構體陣列進行排序,將邊由小到大進行排序,然後不斷的遍歷,只要一條邊上兩端的端點不屬於同一棵樹,就把這條邊加進來,判斷同一棵樹的方法則是採用並查集
模板**如下——
#include #include #include using namespace std;
const int maxn =1e6+10;
#define inf 0x3f3f3f3f
int m,n;
int parent[maxn];//記錄前乙個節點,或者說記錄根節點
struct bian
bian[maxn];//邊節點結構體
bool cmp(bian x,bian y)//用於從小到大排序
}printf("%d\n",ans);
}int main()
sort(bian+1,bian+n+1,cmp);//排序
kruscal();
}return 0;
}
prim演算法
既然kruscal是用了邊的思想,那麼顯然prim演算法採用點的思想——
把已經確定是最小生成樹的點用陣列進行標記,對沒有標記的那些點,通過看他們的鄰接矩陣,來找到權值最小的點,再把它加入到已經標記的點裡面去
具體演算法**如下——
#include #include #include #include #include using namespace std;
#define maxn 1005
#define inf 0x3f3f3f3f
int a[3010][3010],n,m,ans; //用鄰接矩陣儲存圖
bool v[3010]; //標記節點已經加入最小生成樹
int d[3010]; //各節點到最小生成樹的權值
void prim()
prim();
for(int i=2;i<=n;i++)
ans+=d[i];
cout << ans;
}
最小生成樹演算法
由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...
最小生成樹演算法
乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...
演算法 最小生成樹
前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...