最小生成樹演算法

2022-07-11 08:09:13 字數 1495 閱讀 4974

簡單說就是在乙個帶權連通圖(一般是無向圖)裡面生成乙個樹,使得所生成的樹具有最小的權重之和,謂之最小生成樹,這點很容易理解,因為我們在構建樹的時候,不存在環,所以圖的任意兩個頂點之間最多存在一條邊,所以到最後生成的樹一定具備的特徵是:刪減了一部分原來圖當中的edge,這個也就是我們要的結果:生成權重之和最小的樹,也就是最小生成樹,基於最小生成樹的特徵,可以預見的是,最小生成樹不一定是乙個二叉樹。

#include#includeusing  namespace std;

#define max 100

#define maxcost 0x3f3f3f3f

int graph[max][max];

int prim(int graph[max], int node)

mst[1] = 0;

for (i = 2; i <= node; i++)

}cout << "v" << mst[minid] << "-v" << minid << "=" << min << endl;

sum += min;

lowcost[minid] = 0;

for (j = 2; j <= node; j++)

}} return sum;}

int main()

} //構建圖g

for (k = 1; k <= n; k++)

//求解最小生成樹

cost = prim(graph, m);

//輸出最小權值和

cout << "最小權值和=" << cost << endl;

system("pause");

return 0;

}

#include#include#includeusing namespace std;

int n,m,tot=0,k=0;//n端點總數,m邊數,tot記錄最終答案,k已經連線了多少邊

int fat[200010];//記錄集體老大

struct node

edge[200010];

bool cmp(const node &a,const node &b)//sort排序(當然你也可以快排)

int father(int x)//找集體老大,並查集的一部分

void unionn(int x,int y)//加入團體,並查集的一部分

int main()

for(int i=1;i<=n;i++) fat[i]=i;//自己最開始就是自己的老大 (初始化)

sort(edge+1,edge+1+m,cmp);//按權值排序(kruskal的體現)

for(int i=1;i<=m;i++)//從小到大遍歷 }

printf("%d",tot);

return 0;

}

最小生成樹演算法

由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...

最小生成樹演算法

乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...

演算法 最小生成樹

前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...