最小生成樹

2021-10-11 13:27:00 字數 2279 閱讀 1643

/* 

kruskal演算法 求取mst

首先按照w權重對於所有的邊從小到大進行排序

按照最小生成樹的定義來講,就是使得所有的邊上的權重總和最小

由於是一棵樹,所以不能形成環

判斷是否為環 就是找他們的祖先,如果祖先是相同的,就證明乙個是在最後,祖先是在最前,

他們在同一條鏈上,然後這邊上兩個點 相連就變成乙個環了

然後的話就是n條邊只需要選取最短的m-1條邊就可以組成一顆最小生成樹

*/ #include #define ll long long

using namespace std;

const int maxn= 1e3;///1000的大小

int f[maxn];///f(i)代表節點 i 的父親

struct min_edgeedge[maxn];

bool cmp(struct min_edge a,struct min_edge b)///按照w的大小從小到大排序

int fa_find(int x)///找出他們的公共的祖先(最高層次的)

int main()

sort(edge+1,edge+1+n,cmp);///按照w的大小從小到大排序

for (int i=1;i<=m;++i)f[i] = i;///首先的話節點的祖宗就是自身

int cnt = 0;///記錄當前選了多少條邊

for (int i=1;i<=n;++i)///n條邊選取m-1條

}return 0;

}

prim此處用鄰接矩陣存圖,沒有判斷重邊 有需要可以自判 或者改用vector或者鏈式前向星
/*

prim演算法 加點操作 首先確定乙個節點,然後找到離他最近的節點b 普里姆演算法

接下來找到離節點b最近的節點 如此迴圈回溯

但是走過的節點需要標記一下

*/#include #define ll long long

using namespace std;

const int maxn= 1e3;

const int inf=0x3f3f3f3f;/// 乙個極大值

int disc[maxn];///儲存最短距離 disc[i] 第i個節點最短距離 初始值就是節點1到各個點之間的距離w ,不存在就是inf(無窮大)

int close[maxn];///儲存最短的連線點 close[i]代表離節點i最近的那個節點

int g[maxn][maxn];///鄰接矩陣 g[i][j]起點i 終點j上存在一條重w的邊

bool vis[maxn];///標記陣列,如果當前的節點被找過就為1

int main()

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

}if (mine == inf)/// 原圖不聯通 無法找出最小生成樹

cout<"<<' '<#define ll long long

using namespace std;

const int maxn= 1e6;

const int inf=int_max;/// 乙個極大值

int disc[maxn];///儲存最短距離 disc[i] 第i個節點最短距離 初始值就是節點1到各個點之間的距離w ,不存在就是inf(無窮大)

int close[maxn];///儲存最短的連線點 close[i]代表離節點i最近的那個節點

struct node

};vectorg[maxn];/// vector建圖

bool vis[maxn];///標記陣列,如果當前的節點被找過就為1

int all = 0;

signed main()

for (int i=0;i>u>>v>>w;///起始點 終點 權重

g[u].push_back(node(v,w));

g[v].push_back(node(u,w));

} ///for (int i=1;i<=m;++i)disc[i] = inf;

for (int i=0;idisc[j])///從沒有選過的最短路徑中找到離 當前節點最近的那個節點的下標idx

}if (mine == inf)/// 原圖不聯通 無法找出最小生成樹

all += mine;

vis[idx] = true;

///cout<"<<' '

}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...