BZOJ3624 APIO2008 免費道路

2022-05-12 14:44:55 字數 1105 閱讀 9176

**並查集:

題目傳送門:

題目要求的就是恰好包含\(k\)條鵝卵石路的生成樹。

首先我們用水泥邊建出生成樹森林,然後再用鵝卵石邊把森林連成一棵樹。

如果需要用到的鵝卵石邊大於\(k\)則無解。

如果無法連成一棵樹則無解。

連成一棵樹之後也許此時用到的鵝卵石邊比\(k\)要小,我們暫且稱已經用到的鵝卵石邊為必要邊。

我們把樹全部拆掉,然後把必要邊連上,在看看能不能把不足的\(k\)條鵝卵石邊補上,補得上就有解,否則無解。

剩下的用水泥邊填上即可。

時間複雜度:\(o(nlogn)\)

空間複雜度:\(o(n+m)\)

**如下:

#include using namespace std;

const int maxn=2e4+5,maxm=1e5+5;

int fa[maxn];bool bo[maxm];

int n,m,k,cnt1,cnt2,cnt,tot;

int read()

struct road

road(int _a,int _b)

}cob[maxm],cem[maxm],ans[maxn];

int find(int x)

int main()

for(int i=1;i<=n;i++)fa[i]=i;

for(int i=1;i<=cnt1;i++)

if(tot-1>k)

for(int i=1;i<=cnt2;i++)

if(tot!=1)

for(int i=1;i<=n;i++)fa[i]=i;

for(int i=1;i<=cnt2;i++)

if(bo[i])

for(int i=1;i<=cnt2&&k;i++)

if(!bo[i])

if(k)

for(int i=1;i<=cnt;i++)

printf("%d %d 0\n",ans[i].a,ans[i].b);

for(int i=1;i<=cnt1;i++)

return 0;

}

bzoj 3624 Apio2008 免費道路

這題一看,不是一句話題意,不想做。題意就不說了吧。首先想到的肯定是最小生成樹。然後我就想起了以前的某道題。好吧,記不大清了。我一開始的想法是貪心替換。就是先把圖構好,然後用0去換1 也就是先把全部1跑一次,然後把0跑一次,先把必要的0拿出來,然後再在剩下的0裡面選替代1的。然後隨手給自己的替代方法舉...

BZOJ3624 Apio2008 免費道路

bzoj3624 apio2008 免費道路 試題描述 輸入 輸出 輸入示例 572 1304 5132 0531 4301 2142 1輸出示例 320 4305 3112 1資料規模及約定 見 輸入 題解 第一步,先盡量加入 c 1 的邊,若未形成乙個連通塊,則得到必須加入的 c 0 的邊。第二...

bzoj3624 Apio2008 免費道路

失蹤人口回歸。題目大意 求圖一棵生成樹,使得這棵樹里恰好有 k 條特殊邊。兩遍 kruskal 第一遍優先加入非特殊邊,預處理出有哪些邊是非選不可的。第二遍先加入 k 條特殊邊,再加入非特殊邊。判斷 no solution 時細節較多,詳見 includeusing namespace std de...