時間限制: 1000 ms 記憶體限制: 524288 kb
題目描述
原題來自:beijing 2010 組隊賽
給定一張 n 個點 m 條邊的無向圖,求無向圖的嚴格次小生成樹。
設最小生成樹的邊權之和為 sum,嚴格次小生成樹就是指邊權之和大於 sum 的生成樹中最小的乙個。
輸入格式
第一行包含兩個整數 n 和 m,表示無向圖的點數與邊數;
接下來 mm 行,每行三個數 x,y,z,表示點 x 和點 y 之間有一條邊,邊的權值為 z。
輸出格式
包含一行,僅乙個數,表示嚴格次小生成樹的邊權和。
資料保證必定存在嚴格次小生成樹。
樣例樣例輸入
5 6
1 2 1
1 3 2
2 4 3
3 5 4
3 4 3
4 5 6
樣例輸出
11
資料範圍與提示
對於全部資料,1≤n≤10^5,1≤m≤3×10^5,資料中無向圖無自環,邊權值非負且不超過 10^9。
sol:嚴格次小生成樹模板,我使用倍增做的,樹剖也可以(表示不清楚別人為什麼這麼快)
#include usingview codenamespace
std;
const
int n=100005,m=300005,inf=0x3f3f3f3f
;int
n,m;
struct
edge
e[m];
inline
bool
cmp(edge p,edge q)
intfather[n];
long
long mst=0
;bool
edge_bo[m];
inline
int get_father(int
x)struct
tree
int depth[n],f[n][23
];
int val_zd[n][23],val_cd[n][23
]; inline
void dfs(int x,int
fa)
return
; }
inline
void
pre()
}return
; }
inline
int ask_lca(int x,int
y)
inline
int ask_lower(int x,int y,int
z)
return
ans;
}}t;int
main()
; }
sort(e+1,e+m+1
,cmp);
for(i=1;i<=m;i++)
//printf("mst=%d\n",mst);
t.pre();
long
long ans=0x7ffffffffff
;
for(i=1;i<=m;i++) if(!edge_bo[i])
printf(
"%lld\n
",ans);
return0;
}/*input
5 6
1 2 1
1 3 2
2 4 3
3 5 4
3 4 3
4 5 6
output
11*/
一本通1600 例 4 旅行問題
時間限制 1000 ms 記憶體限制 524288 kb 原題來自 poi 2004 john 打算駕駛一輛汽車周遊乙個環形公路。公路上總共有 n n 車站,每站都有若干公升汽油 有的站可能油量為零 每公升油可以讓汽車行駛一千公尺。john 必須從某個車站出發,一直按順時針 或逆時針 方向走遍所有的...
一本通 1 1 例 4 加工生產排程
題目傳送門 這道題是johnson雙流水線排程演算法的基礎題。本題是要求乙個加工順序使得總的加工時間最少,而要使加工時間最少,就是讓各車間的空閒時間最少。一旦a車間開始加工,便會不停地進行加工 我們不要去管車間是否能夠一直生產,因為他們有三班,可以24時間不停地運轉 關鍵是b車間在生產的過程中,有可...
一本通 1 1 例 2 種樹
題目傳送門 這題的題目問的是要滿足所有居民的建議,至少要種多少棵樹。對於這種題目,我們首先想到的應該是貪心策略。貪心策略 首先按右端點從小到大排序,因為要求樹最少,所以要盡量放在右端點。然後定義乙個bool陣列判斷該點是否種過樹即可。從右端點開始種,可以讓更多的樹照顧到更右側的端點,這樣就能使種的數...