最小生成樹 次小生成樹

2021-08-15 16:51:25 字數 2430 閱讀 7895

一、最小生成樹

說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。

因此,樹具有許多性質:

1.兩點之間的路徑是唯一的。

2.邊數等於點數減一。

3.連線任意兩點都會生成乙個環。

對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱為最小權重生成樹,簡稱最小生成樹。

對於最小生成樹問題有兩種演算法,一種是kruskal演算法,另一種是prime演算法。

kruskal演算法:

kruskal演算法就是在得到一張圖之後把圖上所有邊按邊權從小到大排序,然後刪掉所有的邊,再按排完的順序把邊一條一條地加進去,加邊的同時用並查集維護兩點間的連通性,如果一條邊的兩個端點已經聯通,則不將這條邊加入到圖中,直到加了n-1條邊為止。

#include #include #include #include #include using namespace std; 

int n,x,y;

double l;

double s;

int f[100001];

int i=0;

int sum;

double total=0;

struct demacia

;demacia m[100001];

int cmp(demacia x,demacia y)

a[50001];

void add(int x,int y,int v)

int cmp(node a,node b)

int find(int x)

return f[x]=find(f[x]);

}void dfs(int x,int fx)

} return total=max(max(g[x][0],g[y][0]),total);

}int main()

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

sort(a+1,a+1+m,cmp);

num=0;

sum=0;

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

g[1][0]=0;

dfs(1,1);

int q;

scanf("%d",&q);

int a,b;

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

}

嚴格次小生成樹

#include#include#include#include#includeusing namespace std;

int n,m;

int next[600001];

int to[600001];

int val[600001];

int head[100001];

int f[100001][20];

int g[100001][20];

int g2[100001][20];

int d[100001];

int f[100001];

int tot=0;

long long sum;

long long num;

long long cnt;

long long ans=1000000000000000ll;

struct node

a[300001];

struct node1

b[300001];

void add(int x,int y,int v)

int cmp(node a,node b)

else if(g[x][j-1]=0;j--)

}return total=max(max(g[x][0],g[y][0]),total);

}int lca2(int x,int y,int z)

else

if(g[y][j]!=z)

else

x=f[x][j];

y=f[y][j];}}

if(g[x][0]!=z)

else

if(g[y][0]!=z)

else

return total;

}int main()

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

sort(a+1,a+1+m,cmp);

num=0;

sum=0;

cnt=0;

int j=1;

for(int j=1;j<=m;j++)

else

}g[1][0]=0;

dfs(1,1);

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

if(ans>k)

}long long gg=sum+ans;

printf("%lld",gg);

}

最小生成樹 次小生成樹 模板

次小生成樹我的理解 在最小生成樹的基礎上,列舉不再最小生陳樹上的邊,然後成環,取出一條除了新加入的那條邊外的最長邊,最終的權值即為次小生成樹的權值。小結論 當次小生成樹的權值與最小生成樹的權值相同時,最小生成樹不唯一。include include include includeusing name...

最小生成樹與次小生成樹

題意 給出兩個不同方案,每個方案使得所有的城堡被連通 形成連通圖 同時使邊權之和盡量小,問第乙個方案與第二個方案的大小關係。解題思路 因為m個橋能使n個城堡聯通,而兩個大爺的方案中至少存在乙個橋不相同,那麼我們判斷這是乙個求次小生成樹的方法。求次小生成樹模板 列舉 刪邊 再求mst複雜度有點高,看題...

最小生成樹模版與次小生成樹

prim演算法 類似於dij演算法,將每個點距離已經加入的點的集合的最短距離算出,每次取出這些距離裡最短的點加入集合,並在每次加入新的點後更新這些距離即可。演算法模版 define inf 32767 void prim mgraph g,int v krustral演算法 先將所有的邊按照邊權值排...