Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\)
Link.
有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边。你需要为每条白边指定边权,最大化其边权和,并保证 \(m_2\) 条边都在最小生成树中。
\(n,m_1,m_2\le5\times10^5\)。
\(\mathcal{Solution}\)
先保证在 \(\text{MST}\) 中的限制——指定所有边权为 \(0\)。并求出此时的 \(\text{MST}\)。显然最优情况下,\(\text{MST}\) 的形态和现在一样。
那么对于每一条不在 \(\text{MST}\) 上的黑边,相当于限制了一条树上路径的最大值。从小到大枚举这样的边,每个点维护一个指针(整体上就是一个并查集)指向第一个未被限制到父亲边权的祖先,暴力跳指针统计答案即可。
复杂度 \(\mathcal O\left((m_1+m_2)\log(m_1+m_2)\right)\)。
\(\mathcal{Code}\)
#include <cstdio>
#include <algorithm>
#define ww first
#define uu second.first
#define vv second.second
const int MAXN = 5e5, MAXM = 1e6;
int n, m1, m2, m, fa[MAXN + 5];
int ecnt, head[MAXN + 5], trf[MAXN + 5], trc[MAXN + 5], dep[MAXN + 5];
std::pair<int, std::pair<int, int> > eset[MAXM + 5];
bool inmst[MAXM + 5];
struct Edge { int to, cst, nxt; } graph[MAXN * 2 + 5];
inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
}
inline void link ( const int s, const int t, const int c ) {
graph[++ ecnt] = { t, c, head[s] };
head[s] = ecnt;
}
inline void init () { for ( int i = 1; i <= n; ++ i ) fa[i] = i; }
inline int find ( const int x ) { return x ^ fa[x] ? fa[x] = find ( fa[x] ) : x; }
inline bool unite ( int x, int y ) {
return ( x = find ( x ) ) ^ ( y = find ( y ) ) ? fa[x] = y, true : false;
}
inline void DFS ( const int u ) {
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ( v = graph[i].to ) ^ trf[u] ) {
trf[v] = u, trc[v] = graph[i].cst, dep[v] = dep[u] + 1;
DFS ( v );
}
}
}
int main () {
n = rint (), m = ( m1 = rint () ) + ( m2 = rint () );
init ();
for ( int i = 1; i <= m1; ++ i ) {
eset[i].uu = rint (), eset[i].vv = rint ();
eset[i].ww = 0;
}
for ( int i = m1 + 1; i <= m; ++ i ) {
eset[i].uu = rint (), eset[i].vv = rint ();
eset[i].ww = rint ();
}
std::sort ( eset + 1, eset + m + 1 );
for ( int i = 1, cnt = 0; i <= m; ++ i ) {
if ( unite ( eset[i].uu, eset[i].vv ) ) {
inmst[i] = true;
link ( eset[i].uu, eset[i].vv, eset[i].ww );
link ( eset[i].vv, eset[i].uu, eset[i].ww );
if ( ++ cnt == n - 1 ) break;
}
}
DFS ( 1 ), init ();
long long ans = 0; int limited = 0;
for ( int i = m1 + 1; i <= m; ++ i ) {
if ( inmst[i] ) continue;
int u = find ( eset[i].uu ), v = find ( eset[i].vv ), w = eset[i].ww;
while ( u ^ v ) {
if ( dep[u] < dep[v] ) u ^= v ^= u ^= v;
if ( ! trc[u] ) ans += w, ++ limited;
int t = find ( trf[u] );
unite ( u, t ), u = t;
}
}
printf ( "%lld\n", limited == m1 ? ans : -1 );
return 0;
}
Solution -「CF 1023F」Mobile Phone Network的更多相关文章
- Solution -「CF 555E」Case of Computer Network
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的无向图,判断是否有给每条边定向的方案,使得 \(q\) 组有序点对 \((s,t)\) ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 1237E」Balanced Binary Search Trees
\(\mathcal{Description}\) Link. 定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 599E」Sandy and Nuts
\(\mathcal{Description}\) Link. 指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...
随机推荐
- NIO【同步非阻塞io模型】关于 NIO socket 的详细总结【Java客户端+Java服务端 + 业务层】【可以客户端间发消息】
1.前言 以前使用 websocket来实现双向通信,如今深入了解了 NIO 同步非阻塞io模型 , 优势是 处理效率很高,吞吐量巨大,能很快处理大文件,不仅可以 做 文件io操作, 还可以做sock ...
- console.log(a)和console.log(window.a)的区别?
console.log(window.l); //undefined console.log(l); //Uncaught ReferenceError: l is not defined js对于未 ...
- iframe页面二次登录问题
原文链接:iframe页面二次登录问题 生产问题 问题背景 由于历史原因,公司内部系统有一些页面是基于iframe嵌入的其他系统的页面,之前一直运行正常,最近不知什么原因接连出现访问所有iframe页 ...
- asp.net core 中优雅的进行响应包装
目录 摘要 正常响应/模型验证错误包装 实现按需禁用包装 如何让 Swagger 识别正确的响应包装 禁用默认的模型验证错误包装 使用方法以及自定义返回结构体 SourceCode && ...
- Mybatis(万能map)
mybatis(万能map) 我们使用对象作为参数有一个缺点: 我们要在mapper.xml文件和测试中要把所有的字段都写出来,那么,假如一个对象有100个字段,那我们要把这些字段都写出来吗? 所以这 ...
- HDU 2044 一只小蜜蜂... (斐波那契数列)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2044 题目分析:其实仔细读题就会发现其中的规律, 其中:这是一个典型的斐波那契数列. 代码如下: #i ...
- 干掉 Postman?测试接口直接生成API文档,ApiPost真香!
实不相瞒我的收藏夹里躺着很多优质的开发工具,我有个爱好平时遇到感兴趣的开发工具都会记录下来,然后有时间在慢慢研究.前几天刚给同事分享一款非常好用的API文档工具,真的被惊艳到了,粉丝朋友们也感受一下吧 ...
- java下拉框转换公共方法
1. 下拉框实例类 import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.Boolean ...
- flume安装及使用
最近在学习hadoop大数据平台,但是却感觉无从下手,于是看了一些专业的书籍,觉得还是先从下往上为学习也就是从源数据--数据抽取--存储--计算--展示这个路线来学习比较容易一些,所以就先从非结构化数 ...
- 【刷题-LeetCode】164 Maximum Gap
Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...