這樣陰沉的天氣持續下去,我們不免擔心起他的健康。
51nod魔法學校近日開展了主題為「天氣晴朗」的魔法交流活動。
n名魔法師按陣法站好,之後選取n - 1條魔法鏈將所有魔法師的魔力連線起來,形成乙個魔法陣。
魔法鏈是做法成功與否的關鍵。每一條魔法鏈都有乙個魔力值v,魔法最終的效果取決於陣中所有魔法鏈的魔力值的和。
由於逆天改命的魔法過於暴力,所以我們要求陣中的魔法鏈的魔力值最大值盡可能的小,與此同時,魔力值之和要盡可能的大。
現在給定魔法師人數n,魔法鏈數目m。求此魔法陣的最大效果。
input兩個正整數n,m。(1 <= n <= 10^5, n <= m <= 2 * 10^5)
接下來m行,每一行有三個整數a, b, v。(1 <= a, b <= n, int_min <= v <= int_max)
保證輸入資料合法。output輸出乙個正整數r,表示符合條件的魔法陣的魔力值之和。sample input
4 6sample output1 2 3
1 3 1
1 4 7
2 3 4
2 4 5
3 4 6
12題目大意 :求邊權的最大值盡可能小的情況下,所有邊權值的和最大。
題目分析 :題目其實告訴我們,存在乙個連通的路徑,其中的一條最大邊權是所有路徑最大值中的最小值。然後,我們在不超過改邊權的情況下,選擇邊權和最大的
一條路徑。如此一來,我們無非是先利用最小生成樹,求得限制邊權。再利用最大生成樹和限制邊權求的最大邊權和。
易錯點 :城鎮是從1開始的,不是0;
不連通的時候,也要考慮。
最後的的結果要用到long long型別。
題目收穫 :如何判斷是否連通。
ac** :
#include #include#include
#include
const
int maxn = 1e5 + 5
;typedef
long
long
ll;using
namespace
std;
intn, m, per[maxn];
struct
bridge
bridge[
2*maxn];
bool
cmp1(bridge x, bridge y)
bool
cmp2(bridge x, bridge y)
void
init()
int findset(int
x)void unionset(int x, int
y)int
fdown_k()
if (as == n - 1
)
break
; }
if (as == n - 1
)
return
ans;
else
return -1;}
ll fup_k(
intans)
if (as == n - 1
)
break
; }
if (as == n - 1
)
else
return -1;}
intmain()
return0;
}
帶有度限制的最小生成樹
概念 在乙個無向圖中,在某個特殊點限制了必須為k度的情況下,而求出的最小生成樹。一些闡述 關於字母 設邊集為e,特殊點為v0,最小限制生成樹為d。hi表示v0的度數為i時的最小生成樹。關於操作 刪添操作 在樹上加入某條頂點為v0的點,在構成的環中刪掉另一條不與v0關聯的邊。最大刪添 刪添時去掉環中最...
最大邊和最小邊之差最小的生成樹 UVA 1394
題目大意 給你n個點的圖,求苗條度 最大邊減最小編 盡量小的生成樹 思路 sort以後暴力列舉區間即可 看看會不會爆int 陣列會不會少了一維!取物問題一定要小心先手勝利的條件 include using namespace std define ll long long define all a ...
最小生成樹的解法
下標為1 n 返回最小生成樹的權值,返回 1說明無連通 define inf 0x3f3f3f3f int g 1001 1001 int vis 1001 lowc 1001 void init int x,int y,int v int prim int g 1001 int n return ...