COGS 1578 次小生成樹初級練習題

2022-04-04 21:28:48 字數 1324 閱讀 5725

☆   輸入檔案:mst2.in輸出檔案:mst2.out簡單對比

時間限制:1 s   記憶體限制:256 mb

求嚴格次小生成樹

第一行包含兩個整數n 和m,表示無向圖的點數與邊數。 接下來 m行,每行 3個數x y z 表示,點 x 和點y之間有一條邊,邊的權值為z。

包含一行,僅乙個數,表示嚴格次小生成樹的邊權和。(資料保證必定存在嚴格次小生成樹)

5 61 2 1

1 3 2

2 4 3

3 5 4

3 4 3

4 5 6

11
資料中無向圖無自環; 50% 的資料n≤2 000 m≤3 000; 80% 的資料n≤50 000 m≤100 000; 100% 的資料n≤100 000 m≤300 000 ,邊權值非負且不超過 10^9 。

bzoj。。。

求次小生成樹的兩種方法

1:首先求出最小生成樹t,然後列舉最小生成樹上的邊,計算除了列舉的當前最小

生成樹的邊以外的所有邊形成的最小生成樹ti,然後求最小的ti就是次小生成樹。

2:首先計算出最小生成樹t,然後對最小生成樹上任意不相鄰的兩個點 (i,j)

新增最小生成樹以外的存在的邊形成環,然後尋找i與j之間最小生成樹上最長的邊刪去,

計算map[i][j](最小生成樹以外存在的邊) 與 maxd[i][j](最小生成樹上最長的邊)

差值,求出最小的來,w(t)再加上最小的差值就是次小生成樹了。

此**採用的是第一種 

屠龍寶刀點選就送

#include #include 

#define m 300500

#define n 100500

using

namespace

std;

struct

edge

}edge[m];

int nt[n],fa[n],n,m,zx,ans=0x7fffffff

;int find_(int x)

intmain()

; }

for(int i=1;i<=n;i++) fa[i]=i;

sort(edge+1,edge+1+m);

for(int num=0,i=1;i<=m;i++)

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

}if(num_==n-1&&now!=zx) ans=min(ans,now);

}printf(

"%d\n

",ans);

return0;

}

cogs P1578 模板 次小生成樹初級練習題

輸入檔案 mst2.in輸出檔案 mst2.out簡單對比 時間限制 1 s 記憶體限制 256 mb 求嚴格次小生成樹 第一行包含兩個整數n 和m,表示無向圖的點數與邊數。接下來 m行,每行 3個數x y z 表示,點 x 和點y之間有一條邊,邊的權值為z。包含一行,僅乙個數,表示嚴格次小生成樹的...

COGS T 1578 次小生成樹初級練習題

輸入檔案 mst2.in輸出檔案 mst2.out簡單對比 時間限制 1 s 記憶體限制 256 mb 求嚴格次小生成樹 第一行包含兩個整數n 和m,表示無向圖的點數與邊數。接下來 m行,每行 3個數x y z 表示,點 x 和點y之間有一條邊,邊的權值為z。包含一行,僅乙個數,表示嚴格次小生成樹的...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...