最小生成樹的最大邊權限制下的最大生成樹

2022-08-05 10:12:19 字數 1812 閱讀 9752

這樣陰沉的天氣持續下去,我們不免擔心起他的健康。

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 6

1 2 3

1 3 1

1 4 7

2 3 4

2 4 5

3 4 6

sample output

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 ...