最小樹 次小樹 模板

2021-06-20 20:20:04 字數 973 閱讀 5670

最小生成樹

兩種演算法,kruskal 和 prim ;

kruskal 是針對於稀疏圖的,因為他的複雜度是跟邊有關係的;

先sort一便,然後用並查集加邊就行了,簡單沒什麼說的.

prim 是針對於稠密圖的,這個演算法自己很少用,就是每次都找到加入後邊最小的那個點

加進來就行了,前兩天hdu4756逼得我不得不看這個演算法.

次小樹次小樹自己常用的也是兩種演算法,不知道名字,可能算不上是什麼演算法吧

先說一下思想吧,次小樹其實就是先找到一顆最小樹,然後刪除其中一條邊,找到乙個最有

的可以連線兩個集合的邊就行了,更新到最後就是次小樹,其實也可以這樣,先跑一邊最小樹,

然後列舉所有不是最小樹上的邊,想下,如果這條邊加在最小樹裡肯定會產生環,所以直接找

到環中最長的邊(該邊除外)減去就行了,這樣更新到最後也是次小樹,這就是第二種方法,第

一種方法中的找最小可以用樹形dp去優化,如果暴力時間複雜度肯能會到o(n^3);

下面是模板

kruskal

#include

#define max_edge 10000//邊的最大個數 

#define max_node 1000//點的最大個數

using namespace std;

typedef struct

edge;

edge edge[max_edge]; //把邊存到這裡 

int mer[max_edge];

bool camp(edge a ,edge b)

int finds(int x)

struct kruskal

return ans; 

}}k;

prim

struct prim //從0開始用 

}  }  }

}p;剩下的那兩個 還沒有總結好模板,最近也正在學,學完在總結補上吧..

hdu4081 最小樹 DFS或者次小樹的變形

題意 給你乙個全圖,在裡面找到一棵樹,這棵樹最多只有一條邊可以不是最小樹 也可以是 要求 那對特殊的邊的兩個權值 除了這條邊其他邊的和最大.思路 方法有很多,最少有三種方法,我用兩種方法做的,別的暫時沒想到 太弱了 第一種 先求出來一顆最小樹,然後列舉樹上的邊,列舉到每一條邊的時候就假設把這條邊刪除...

大樹和小樹

給定一棵樹,輸出樹的根root,孩子最多的結點max以及他的孩子 第一行 n 結點數 100 m 邊數 200 以下m行 每行兩個結點x和y,表示y是x的孩子 x,y 1000 第一行 樹根 root。第二行 孩子最多的結點max。第三行 max的孩子。8 7 4 14 2 1 31 5 2 62 ...

資料結構之生成最小樹

這裡主要講了兩個演算法。首先說明下,本文講到的兩個演算法都是和連線矩陣和連線表沒有關係的,因為每個演算法開始的時候,都會有乙個初始化 經過初始化後,最後都會變成統一的演算法語句。我們這裡會介紹兩種演算法,第一種演算法,prim演算法。這個演算法,內容就是加點法,可以理解為在u集合周圍找到權值最小的邊...