【模板】最小度限制生成树 题解
其他的题解感觉都好高级,分享一种好想且好实现的方法。
我们可以先把点
我们不难发现,当要求与
接下来这个问题就转化成了:
接下来的部分,我们假设
我们不难发现
我们接下来考虑合并两个连通块(单个点也是联通块),将他们变成一个连通块,我们发现将
我们令
接下来问题就转化成了我们要全局维护一个
我们对于每一个连通块使用一个堆来维护
请注意:
更新的时候我们要注意:如果堆首所对应的
复杂度:
当然,我们也可以使用可并堆,复杂度就可以变成
如果每一次我们都在可并堆合并的时候启发式的删除所有两个连通块相连的边,复杂度就变成了
我们接下来解决不够的边,如果一开始
int n, m, num[L], fa[L], _s, k, ww;
ll ans;
int _u[L], _v[L];
__gnu_pbds::priority_queue<pii, greater<pii>, __gnu_pbds::pairing_heap_tag> s[L], S;
int getfa(int w) {
if(fa[w] == w) return fa[w];
else return fa[w] = getfa(fa[w]);
}
void merge(int a, int b) {
S.pop();
int af = getfa(a), bf = getfa(b);
if(s[af].size() > s[bf].size()) swap(af, bf);
fa[af] = bf;
num[bf] = min(num[bf], num[af]);
s[bf].join(s[af]);
while(!s[bf].empty() && getfa(_u[s[bf].top().second]) == getfa(_v[s[bf].top().second])) s[bf].pop();
if(!s[bf].empty()) S.push({s[bf].top().first - num[bf], s[bf].top().second});
}
signed main() {
n = read(), m = read(), _s = read(), k = read();
if(k == 0) return puts("Impossible"), 0;
rep(i, 1, n) num[i] = P, fa[i] = i;
rep(i, 1, m) {
int u = read(), v = read(), w = read();
if(u == v) continue;
if(u != _s && v != _s) s[u].push({w, i}), s[v].push({w, i});
else num[v] = min(num[v], w), num[u] = min(num[u], w);
_u[i] = u, _v[i] = v;
}
rep(i, 1, n) if(i != _s) ans += num[i];
rep(i, 1, n) if(i != _s) if(num[i] != P) ww ++;
if(n - 1 == k) {
if(k > ww || S.empty()) puts("Impossible"); else cout << ans << endl;
return 0;
}
rep(i, 1, n) if(i != _s) if(s[i].size()) {S.push({s[i].top().first - num[i], s[i].top().second});}
per(_, n - 2, 1) {
while(!S.empty() && getfa(_u[S.top().second]) == getfa(_v[S.top().second])) S.pop();
if(!S.empty()) ans += S.top().first;
if(_ == k) {
if(k > ww || S.empty()) puts("Impossible"); else cout << ans << endl;
return 0;
}
merge(_u[S.top().second], _v[S.top().second]);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下