最小生成樹
兩種演算法,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集合周圍找到權值最小的邊...