最小生成樹

2021-07-04 08:29:06 字數 2468 閱讀 7507

2018-02-19 23:48:26

現在看,以下內容亂七八糟,什麼鬼玩意,大家別看了,現在沒刪是方便我自己回顧**

題目:生成樹:對於乙個圖g(v,e),選乙個點集為v,邊集為e' ∈ e的子圖稱為生成樹。

最小生成樹:乙個圖的生成樹有很多,裡面權值和最小的生成樹為最小

生成樹(僅有乙個)。

求解方法有兩個:prim(普里姆)和kruskal(克魯斯卡爾)

複雜度:o(n^2),所以適合稠密圖(點少邊多)。思想跟dijkstra基本一致,**也基本一致。

假設我們要構造一棵生成樹,那麼選取乙個到樹的距離dis(u)最短的點u加到樹上,則該樹的權值和最小,然後更新所有跟點u相連且不在樹上的點v。選取點u後,點v到樹上的距離為dis[v] = min( dis[v] , map[u,v] )。然後重複這樣選取更新n-1次(n-1個邊即可連n個點)

#include #include #include using namespace std;

const int maxn = 105;

const int inf = 0x3f3f3f3f;

int n, m;

int dis[maxn], mat[maxn][maxn], vis[maxn];

//dis[i]: i點到目標的最小生成樹的距離

int prim(int src)

vis[src] = 1;

dis[src] = 0;

//迴圈n-1次

for (int i = 0; i < n - 1; ++i)

}ans += tmp;

vis[k] = 1;

for (int j = 1; j <= n; ++j) }}

return ans;

}int main()

cout << prim(1) << endl;

}return 0;

}

複雜度:o(elog

2v),適合稀疏圖(點多邊少)。思想極其簡單。

圖中最短的那條邊肯定在最小生成樹上(廢話),所以加到樹上,那麼剩下的圖中最短的邊還是肯定符合在最小樹上的條件,就這樣每次選最短的邊即可。(須保證圖聯通才可直接使用)同時,選的邊兩點必須不在同乙個聯通分量裡,用乙個father陣列區分,father[i]表示i號點所在的集合,如果father[i] = father[j]則表示在乙個聯通分量裡。

#include #include #include #include #define rep( i , a , b ) for ( int i = a ; i <= b ; ++ i )

#define clr( a , x ) memset ( a , x , sizeof (a) );

using namespace std;

const int maxn = 105;

const int maxm = 105*100; //無向邊

const int inf = 0x3f3f3f3f;

int n,m;

int father[maxn];

struct edgeedge[maxm];

bool cmp(edge a,edge b)

int kruskal()}}

}return ans;

}int main()

rep(i,0,m-1)

cout《上面

int fu = father[u];

int fv = father[v];

if(fu != fv)

}}

的fu,fv不能省略成

if(father[u] != father[v])

}}

會wa並查集優化kruskal

#include #include #include #include #define rep( i , a , b ) for ( int i = a ; i <= b ; ++ i )

#define clr( a , x ) memset ( a , x , sizeof (a) );

using namespace std;

const int maxn = 105;

const int maxm = 105*100; //無向邊

const int inf = 0x3f3f3f3f;

int n,m;

int f[maxn];

struct edgeedge[maxm];

bool cmp(edge a,edge b)

int find(int x)

void merge(int x,int y)

}int kruskal()

}return ans;

}int main()

rep(i,0,m-1)

cout<

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...