☆ 輸入檔案: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的生成樹,而各邊權和最小的生成樹則被稱...