題解:
這題是要求乙個生成樹,要求生成樹中要有k條石子路。
我們一開始先盡量讓生成樹里多一點水泥路,這樣就可以知道哪些石子路是必須要的。
如果必須要的多於k,則無解。
然後再把一些水泥路換成石子路,
接著再判判無解。
#include#include#include#include#includeusing namespace std;
const int n=1e5+5;
const int m=20010;
int n,m,k;
struct nodesa[n];
bool cmp(node x,node y)
bool cmp1(node x,node y)
if(sum[0]==k)
//找到有用的石子路
for(int i=1;i<=n;i++) fa[i]=i;
sum[1]=0;
for(int i=1;i<=m;i++)
if(sa[i].tf&&!sa[i].id)
else sa[i].tf=0;
sort(sa+1,sa+1+m,cmp1);
for(int i=1;i<=m;i++)
if(!sa[i].tf&&!sa[i].id)
if(sum[0]==k) break;
} if(sum[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 條鵝卵石路的生成樹。首先我們用水泥邊建出生成樹森林,然後再用鵝卵石邊把森林連成一棵樹。如果需要用到的鵝卵石邊大於 k 則無解。如果無法連成一棵樹則無解。連成一棵樹之後也許此時用到的鵝卵石邊比 k 要小,我們暫且稱已經用到的鵝卵石邊為必要邊。我們把樹全部...