bzoj3624 Apio2008 免費道路

2022-05-19 05:22:57 字數 1482 閱讀 8999

失蹤人口回歸。

題目大意:求圖一棵生成樹,使得這棵樹里恰好有 \(k\) 條特殊邊。

兩遍 \(kruskal\) ,第一遍優先加入非特殊邊,預處理出有哪些邊是非選不可的。第二遍先加入 \(k\) 條特殊邊,再加入非特殊邊。判斷 \(no\)

\(solution\)時細節較多,詳見**。

#includeusing namespace std;

#define n 200001

#define rep(i, a, b) for (int i = a; i <= b; i++)

#define drp(i, a, b) for (int i = a; i >= b; i--)

#define no

inline int read()

while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); return x * flag;

}inline void write(int x) if (x < 0) putchar('-'), x = -x;

char buf[30] = ""; int top = 0; while (x) buf[++top] = x % 10 + '0', x /= 10; while (top) putchar(buf[top--]);

}int n, m, k;

struct edgetype

}eg[n];

bool cmp(const edgetype& a, const edgetype& b)

int fa[20001];

int find(int x)

int main()

if (spcnt > k) no;

memset(fa, 0, sizeof fa); int cnt = 0; spcnt = 0;

rep(i, 1, m) if (eg[i].chos)

drp(i, m, 1)

if (cnt ^ (n - 1)) no;

rep(i, 1, m) eg[i].output();

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 要小,我們暫且稱已經用到的鵝卵石邊為必要邊。我們把樹全部...