P2619 國家集訓隊2 Tree I

2021-10-10 06:59:56 字數 848 閱讀 2883

新增鏈結描述

二分題,考慮kruskal的過程,讓白邊變成need條,權值定了的時候,最小生成樹是定的,如果現在白邊的數量大於need條,那麼我們需要整體增加白邊的權值,相當於讓白邊減少,如果多的話相反。至於增加多少,需要二分去判定。這道題細節挺多的,比如可能有權值+mid會導致白邊多了,權值+mid+1的時候,白邊少了,而題目中說了,保證有解,說明此時有白邊的權值等於黑邊權值的時候,而且可以相互替代構造最小生成樹。這時候處理呢,只要排序的時候將白邊放在前面,然後二分的時候統計邊數大於need的情況更新答案就行了。注意統計答案的時候也可能會出錯。

#include

#define ll long long

#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);

using

namespace std;

const

int maxn=

1e5+5;

struct cor

v[maxn]

;int f[maxn]

,sum,n,m,need,ans,tem;

bool

cmp(cor x,cor y)

intfind

(int x)

void

kruskal()

}}intmain()

else r=mid-1;

for(

int i=

0;i(v[i]

.col==0)

v[i]

.c-=mid;

} cout

}

P2619 國家集訓隊2 Tree I

鏈結分析 為了確定白邊選入的數量,所以給白邊加乙個權值,二分這個值,然後最小生成樹。可以發現白邊的數量雖這個值的增大而減小,滿足單調性。有乙個問題 如果在二分過程中給白邊加上mid,白邊數比need多,加mid 1,白邊數need少。即存在很多相等的白邊 和 很多相等的黑邊。如果白邊大於need一定...

P2619 國家集訓隊2 Tree I

給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。題目保證有解。第一行v,e,need分別表示點數,邊數和需要的白色邊數。接下來e行,每行s,t,c,col表示這邊的端點 點從0開始標號 邊權,顏色 0白色1黑色 一行表示所求生成樹的邊權和。v 50000...

國家集訓隊2 Tree I

給你乙個無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有need條白色邊的生成樹。題目保證有解。好像有個套路 對於有個數要求的某種邊,可以改變它們的權值,以改變它們加入最小生成樹的順序 包括移出最小生成樹 改變量可以二分。因為改變量 包括符號 越大,加入的邊就越少。細節 include ...