bzoj3624 Apio2008 免費道路

2022-05-21 14:12:08 字數 1003 閱讀 2224

(題目鏈結)

給出一張無向圖,其中有0類邊和1類邊。問能否構成正好有k條0類邊的生成樹,並輸出方案。

先將所有1類邊加入生成樹,然後再加入0類邊,那麼現在加入的0類邊就是必須加入的0類邊,將它們打上標記。然後再將並查集初始化,繼續加0類邊直到數量達到k,最後加1類邊。

最後必須輸出換行符。。。

// bzoj3624

#include#include#include#include#include#include#define ll long long

#define inf 2147483640

#define pi acos(-1.0)

#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);

using namespace std;

const int maxn=20010,maxm=100010;

struct edge e[2][maxm],ans[maxm];

int n,m,k,m[2],fa[maxn];

int find(int x)

int main() ;

} int cnt=0,s=0;

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

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

if (cntk)

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

for (int i=1;i<=s;i++) fa[find(ans[i].u)]=find(ans[i].v);

for (int i=1;i<=m[0];i++)

if (sfor (int i=1;i<=m[1];i++)

for (int i=1;i<=s;i++) printf("%d %d %d\n",ans[i].u,ans[i].v,ans[i].w);

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 條鵝卵石路的生成樹。首先我們用水泥邊建出生成樹森林,然後再用鵝卵石邊把森林連成一棵樹。如果需要用到的鵝卵石邊大於 k 則無解。如果無法連成一棵樹則無解。連成一棵樹之後也許此時用到的鵝卵石邊比 k 要小,我們暫且稱已經用到的鵝卵石邊為必要邊。我們把樹全部...