**並查集:
題目傳送門:
題目要求的就是恰好包含\(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...