新亞(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 圖...