BZOJ3624 Apio2008 免費道路

2022-05-09 22:10:18 字數 1629 閱讀 8758

[bzoj3624][apio2008]免費道路

試題描述

輸入

輸出

輸入示例

572

1304

5132

0531

4301

2142

1

輸出示例

320

4305

3112

1

資料規模及約定

見「輸入」。

題解

第一步,先盡量加入 c = 1 的邊,若未形成乙個連通塊,則得到必須加入的 c = 0 的邊。

第二步,加入那些必須加入的 c = 0 的邊,盡量加入 c = 0 的邊直到這種邊數量達到 k,再加入 c = 1 的邊直到形成一棵樹。

最後判一判 no solution 的情況。

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int buffersize = 1 << 16;

char buffer[buffersize], *head, *tail;

inline char getchar()

return *head++;

}int read()

while(isdigit(c))

return x * f;

}#define maxn 20010

#define maxm 100010

int n, m, k;

struct edge

} es[maxm];

int fa[maxn];

void init()

int findset(int x)

int main()

for(int i = 1; i <= m; i++) if(!es[i].c)

int cnt = 0;

init();

for(int i = 1; i <= m; i++) if(es[i].has) fa[findset(es[i].v)] = findset(es[i].u), cnt++;

for(int i = 1; i <= m && cnt < k; i++) if(!es[i].c)

for(int i = 1; i <= m; i++) if(es[i].c)

if(cnt != k) puts("no solution");

else for(int i = 1; i <= m; i++) if(es[i].has) printf("%d %d %d\n", es[i].u, es[i].v, es[i].c);

return 0;

}

bzoj 3624 Apio2008 免費道路

這題一看,不是一句話題意,不想做。題意就不說了吧。首先想到的肯定是最小生成樹。然後我就想起了以前的某道題。好吧,記不大清了。我一開始的想法是貪心替換。就是先把圖構好,然後用0去換1 也就是先把全部1跑一次,然後把0跑一次,先把必要的0拿出來,然後再在剩下的0裡面選替代1的。然後隨手給自己的替代方法舉...

BZOJ3624 APIO2008 免費道路

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

bzoj3624 Apio2008 免費道路

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