APIO2008 免費道路 生成樹

2022-07-13 20:33:28 字數 1546 閱讀 5722

新亞(new asia)王國有 n 個村莊,由 m 條道路連線。其中一些道路是鵝卵石路,而其它道路是水泥路。保持道路免費執行需要一大筆費用,並且看上去 王國不可能保持所有道路免費。為此亟待制定乙個新的道路維護計畫。

國王已決定保持盡可能少的道路免費,但是兩個不同的村莊之間都應該一條且僅由一條 且僅由一條免費道路的路徑連線。同時,雖然水泥路更適合現代交通的需 要,但國王也認為走在鵝卵石路上是一件有趣的事情。所以,國王決定保持剛好 k 條鵝卵石路免費。

舉例來說,假定新亞王國的村莊和道路如圖 3(a)所示。如果國王希望保持兩 條鵝卵石路免費,那麼可以如圖 3(b)中那樣保持道路(1, 2)、(2, 3)、(3, 4)和(3, 5) 免費。該方案滿足了國王的要求,因為:(1)兩個村莊之間都有一條由免費道 路組成的路徑;(2)免費的道路已盡可能少;(3)方案中剛好有兩條鵝卵石道路 (2, 3)和(3, 4)

solution

題意:有黑白兩種邊,求一科最小生成樹使他恰好有k條百邊

直接先選k條白邊再加黑邊是錯的,因為加完之後圖可能不連通,所以我們先要弄清楚哪些白邊是必須加的。

我們先對所有黑邊做生成樹,在對白色邊跑一遍,這樣我們就求出了哪些白邊是必須要加的。

然後我們再跑一遍生成樹,先把必須加的加上,再把k條白邊補齊,最後再跑黑邊。

接下來就是噁心的判不合法環節,

如果圖不連通,gg。

如果必須加的邊大與k,gg。

如果加的邊到不了k,gg。

code

#include#include

#define n 20002

#define m 100002

using

namespace

std;

intf[n],n,m,num,k,kk,tot,tot1,kkk;

bool

t[m];

struct

nodee[m],g[m];

int find(int x)

intmain()

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

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

}for(int i=1;i<=tot1;++i)

} if(num!=n-1||k<0

) num=0

;

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

for(int i=1;i<=tot1;++i)if

(t[i])

for(int i=1;i<=tot1;++i)if(!t[i])

}for(int i=1;i<=tot;++i)

}if(num!=n-1||kk)

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

for(int i=1;i<=tot1;++i)if

(t[i])

for(int i=1;i<=tot1;++i)if(!t[i])

}for(int i=1;i<=tot;++i)

}return0;

}

APIO2008 免費道路

bzoj luogu 先把必須連的鵝卵石路連上,大於k條no solution 什麼樣的鵝卵石路 u,v 必須連?所有水泥路都連上仍然不能使u,v連通的必須連 補全到k條鵝卵石路,補不全no solution 最後用水泥路構出生成樹,構不出no solution includeusing names...

APIO2008 免費道路

kruskal 好題 0 邊的數量在某些情況下是可以無限制的調控的,前提是所有必須存在的邊都在生成樹里了 所以應該分別求出有哪些邊是必須在生成樹里的,我們可以先從大到小排序,求出有哪些 0 邊必須在生成樹里,之後再從小到大排序,求出那些 1 邊必須在生成樹里 之後剩下的邊就可以隨便放了,調控 0 邊...

APIO2008 免費道路 克魯斯卡爾專精

題面 給定一張n個點m條邊的無向圖 不保證聯通 其中圖上每個邊都有顏色 黑白 現在要構造一棵生成樹,使樹上黑邊數量等於k,如果不存在合法的構造方案,輸出 no solution k 2 10 4k k2 104m 10 5m le10 5 m 105題解 首先考慮什麼時候會no solotion 圖...