bzoj 3624 Apio2008 免費道路

2021-08-04 13:55:12 字數 1527 閱讀 1090

這題一看,不是一句話題意,不想做。。

題意就不說了吧。。

首先想到的肯定是最小生成樹。。

然後我就想起了以前的某道題。。好吧,記不大清了。。

我一開始的想法是貪心替換。。

就是先把圖構好,然後用0去換1

也就是先把全部1跑一次,然後把0跑一次,先把必要的0拿出來,然後再在剩下的0裡面選替代1的。。

然後隨手給自己的替代方法舉了個反例。。

那怎麼辦呢

首先把,第一步中不要的0是肯定的,那麼替代方法要改一改。。

那我們乾脆在剩下的隨便拿不就好了嘛,給他湊夠k個,反正圖肯定有解

感覺很對。。

於是就a了

#include

#include

const int n=20005;

const int m=100005;

int n,m,k;

struct qq

s[m];int num;

void init (int

x,int

y,int z)

qq e[m];int num1;//鵝卵石路

void init1 (int

x,int

y,int z)

int f[n];

int find (int

x) int main()

// for (int u=1;u<=num;u++) printf("%d

%d%d\n",s[u].x,s[u].y,s[u].z);

for (int u=1;u<=num;u++)//先把瀝青路都掃一遍

for (int u=1;u<=num1;u++)

if (k<0)

int ooo=find(1);

for (int u=2;u<=n;u++)

if (find(u)!=ooo)

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

for (int u=1;u<=num1;u++)

}for (int u=1;u<=num1;u++)

//printf("%d ",k);

/*for (int u=1;u<=num1;u++)

if (e[u].tf)

printf("%d %d %d\n",e[u].x,e[u].y,e[u].z);*/

for (int u=1;u<=num;u++) s[u].tf=false;

for (int u=1;u<=num;u++)

for (int u=1;u<=num;u++)

if (s[u].tf)

printf("%d

%d%d\n",s[u].x,s[u].y,s[u].z);

for (int u=1;u<=num1;u++)

if (e[u].tf)

printf("%d

%d%d\n",e[u].x,e[u].y,e[u].z);

return

0;}

BZOJ3624 Apio2008 免費道路

bzoj3624 apio2008 免費道路 試題描述 輸入 輸出 輸入示例 572 1304 5132 0531 4301 2142 1輸出示例 320 4305 3112 1資料規模及約定 見 輸入 題解 第一步,先盡量加入 c 1 的邊,若未形成乙個連通塊,則得到必須加入的 c 0 的邊。第二...

BZOJ3624 APIO2008 免費道路

並查集 題目傳送門 題目要求的就是恰好包含 k 條鵝卵石路的生成樹。首先我們用水泥邊建出生成樹森林,然後再用鵝卵石邊把森林連成一棵樹。如果需要用到的鵝卵石邊大於 k 則無解。如果無法連成一棵樹則無解。連成一棵樹之後也許此時用到的鵝卵石邊比 k 要小,我們暫且稱已經用到的鵝卵石邊為必要邊。我們把樹全部...

bzoj3624 Apio2008 免費道路

失蹤人口回歸。題目大意 求圖一棵生成樹,使得這棵樹里恰好有 k 條特殊邊。兩遍 kruskal 第一遍優先加入非特殊邊,預處理出有哪些邊是非選不可的。第二遍先加入 k 條特殊邊,再加入非特殊邊。判斷 no solution 時細節較多,詳見 includeusing namespace std de...