\(\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的更多相关文章

  1. Solution -「CF 555E」Case of Computer Network

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的无向图,判断是否有给每条边定向的方案,使得 \(q\) 组有序点对 \((s,t)\) ...

  2. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  3. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  4. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  5. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  6. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  7. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  8. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  9. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

随机推荐

  1. ssh到localhost或127.0.0.1拒绝连接

    通过ssh连接到本机报错 ssh: connect to host localhost port 22: Connection refused, 你能用ssh登录其它主机并不代表着本地有ssh服务,要 ...

  2. 金融云原生漫谈(三)|银行云原生基础设施构建:裸金属VS虚拟机

    在金融行业数字化转型的驱动下,国有银行.股份制银行和各级商业银行也纷纷步入容器化的进程.   如果以容器云上生产为目标,那么整个容器云平台的设计.建设和优化对于银行来说是一个巨大的挑战.如何更好地利用 ...

  3. css上下居中

    position: absolute; top: 20%; left: 50%; transform: translateX(-50%); -ms-transform: translateX(-50% ...

  4. Solon 开发,六、提取Bean的函数进行定制开发

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  5. actf2020upload

    actf2020upload .php后缀过滤 1.上传文件,要求后缀为.png/.gif/.jpg 2.抓包,后缀改成.phtml后放行,上传成功,访问地址,根目录下找到flag

  6. 搭建vps(virtual private station)之Github教育礼包之DigitalOcean

    最近Github联合很多业内厂商给出了一份学生礼包,可以用来做很多事情,其中包括Digital Ocean的100$优惠,用他可以架设自己的云服务器,选择每月5$套餐可获得512Mb内存20g固态硬盘 ...

  7. [WAF攻防]从WAF攻防角度重看sql注入

    从WAF攻防角度重看sql注入 攻防都是在对抗中逐步提升的,所以如果想攻,且攻得明白,就必须对防有深刻的了解 sql注入的大体流程 Fuzz测试找到注入点 对注入点进行过滤检测,及WAF绕过 构建pa ...

  8. Tomcat-部署web工程方式

    Tomcat(部署web工程) 第一种方法:只需要把web工程的目录拷贝到Tomcat的webapps目录下即可 1,在webapps目录下创建一个book工程, 2,或者把做的工程内容拷贝到weba ...

  9. Redis学习笔记(三)redis 的键管理

    Redis 的键管理 一.Redis 数据库管理 Redis 是一个键值对(key-value pair)的数据库服务器,其数据保存在 src/server.h/redisDb 中(网上很多帖子说在 ...

  10. 资本主义反抗指南精要(v0.1)

    (1)充分预估工作时间,比如一小时的开发任务,你可以加上技术调研,API/数据库设计,单元测试,联调,集成测试等等,拖到一天,同理一天的任务可以拖到一星期. (2)简历上尽一切手段来美化,最好能包装成 ...