失蹤人口回歸。
題目大意:求圖一棵生成樹,使得這棵樹里恰好有 \(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 要小,我們暫且稱已經用到的鵝卵石邊為必要邊。我們把樹全部...