「CF1023F」Mobile Phone Network

传送门

直接钦定那 \(k\) 条边在最小生成树中,然后把最小生成树树剖一下。

每条其它边的效果就是把该边端点路径上的边的权对该边边权取 \(\min\)。

不会区间取 \(\min\) 的看这里

参考代码:

#include <algorithm>
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} typedef long long LL;
const int _ = 5e5 + 5, __ = 1e6 + 5, INF = 2e9; int tot, head[_], nxt[_ << 1], ver[_ << 1], w[_ << 1];
inline void Add_edge(int u, int v, int d)
{ nxt[++tot] = head[u], head[u] = tot, ver[tot] = v, w[tot] = d; } int n, k, m, tag[_], Fa[_], X[__], Y[__], V[__], vis[__];
int dep[_], siz[_], son[_], fa[_], top[_], rev[_], dfn[_], mn[_ << 2]; inline int Find(int x) { return Fa[x] == x ? x : Fa[x] = Find(Fa[x]); } inline void merge(int x, int y) { Fa[Find(x)] = Find(y); } inline int lc(int p) { return p << 1; } inline int rc(int p) { return p << 1 | 1; } inline void f(int p, int v) { mn[p] = min(mn[p], v); } inline void pushdown(int p) { f(lc(p), mn[p]), f(rc(p), mn[p]), mn[p] = INF; } inline void build(int p = 1, int l = 1, int r = n) {
mn[p] = INF;
if (l == r) { mn[p] = tag[rev[l]]; return ; }
int mid = (l + r) >> 1;
build(lc(p), l, mid), build(rc(p), mid + 1, r);
} inline void update(int ql, int qr, int v, int p = 1, int l = 1, int r = n) {
if (ql <= l && r <= qr) return f(p, v);
int mid = (l + r) >> 1;
pushdown(p);
if (ql <= mid) update(ql, qr, v, lc(p), l, mid);
if (qr > mid) update(ql, qr, v, rc(p), mid + 1, r);
} inline int query(int id, int p = 1, int l = 1, int r = n) {
if (l == r) return mn[p];
int mid = (l + r) >> 1, res;
pushdown(p);
if (id <= mid) res = query(id, lc(p), l, mid);
else res = query(id, rc(p), mid + 1, r);
return res;
} inline void dfs(int u, int f) {
dep[u] = dep[f] + 1, siz[u] = 1, fa[u] = f;
for (rg int i = head[u]; i; i = nxt[i]) {
int v = ver[i]; if (v == f) continue ;
tag[v] = w[i];
dfs(v, u), siz[u] += siz[v];
if (siz[son[u]] < siz[v]) son[u] = v;
}
} inline void dfs(int u, int f, int topf) {
top[rev[dfn[u] = ++dfn[0]] = u] = topf;
if (son[u]) dfs(son[u], u, topf);
for (rg int i = head[u]; i; i = nxt[i]) {
int v = ver[i]; if (v == f || v == son[u]) continue ;
dfs(v, u, v);
}
} inline void uptChain(int x, int y, int v) {
int fx = top[x], fy = top[y];
while (fx != fy) {
if (dep[fx] < dep[fy]) swap(x, y), swap(fx, fy);
update(dfn[fx], dfn[x], v), x = fa[fx], fx = top[x];
}
if (dep[x] > dep[y]) swap(x, y);
update(dfn[x] + 1, dfn[y], v);
} int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n), read(k), read(m);
for (rg int i = 1; i <= n; ++i) Fa[i] = i;
for (rg int u, v, i = 1; i <= k; ++i)
read(u), read(v), merge(u, v), Add_edge(u, v, INF), Add_edge(v, u, INF);
for (rg int i = 1; i <= m; ++i) {
read(X[i]), read(Y[i]), read(V[i]);
if (Find(X[i]) != Find(Y[i])) {
vis[i] = 1, merge(X[i], Y[i]);
Add_edge(X[i], Y[i], 0), Add_edge(Y[i], X[i], 0);
}
}
dfs(1, 0), dfs(1, 0, 1), build();
for (rg int i = 1; i <= m; ++i) if (!vis[i]) uptChain(X[i], Y[i], V[i]);
LL ans = 0;
for (rg int i = 2; i <= n; ++i) {
int res = query(i);
if (res == INF) return puts("-1"), 0; else ans += res;
}
printf("%lld\n", ans);
return 0;
}

「CF1023F」Mobile Phone Network的更多相关文章

  1. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  2. 【CF1023F】Mobile Phone Network(dsu,MST)

    题意: 保证原边以边权单调非减的顺序读入 思路:先把未知边加入,再加入原始边做MST,考虑从大到小,用数据结构维护,每一条原始边相当两个链赋值操作,每一条未知边相当于一个询问,答案即为询问之和 LCT ...

  3. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  4. 「CF555E」 Case of Computer Network

    「CF555E」 Case of Computer Network 传送门 又是给边定向的题目(马上想到欧拉回路) 然而这个题没有对度数的限制,你想歪了. 然后又开始想一个类似于匈牙利的算法:我先跑, ...

  5. iOS 9,为前端世界都带来了些什么?「译」 - 高棋的博客

    2015 年 9 月,Apple 重磅发布了全新的 iPhone 6s/6s Plus.iPad Pro 与全新的操作系统 watchOS 2 与 tvOS 9(是的,这货居然是第 9 版),加上已经 ...

  6. 「2014-2-6」TokuMX and MongoDB related materials collection

    简介参考 TokuMX 和 MongoDB 各自的官方站点.       ##  Tokutek 最重要的特点和 marketing word 是所谓 fractal tree indexing te ...

  7. Linux 小知识翻译 - 「NTP」

    这周聊聊「NTP」. 上次,聊了「时区」,也就是时间相关的话题. NTP是「Network Time Protocol」的简称,是为了将网络中计算机的时钟同步到正确时间的协议. PC内部的时钟是相当不 ...

  8. 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!

    ❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...

  9. 「MoreThanJava」计算机系统概述

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

随机推荐

  1. 动手动脑5JAVA项目中的常用的异常处理情况

          Java异常处理的几个原则如下.     (1)不要丢弃异常,捕获异常后需要进行相关处理.如果用户觉得不能很好地处理该异常,就让它继续传播,传到别的地方去处理,或者把一个低级的异常转换成应 ...

  2. spring与jdbc,mybatis的结合

    关键点在于把DataSource(数据源)配置到spring容器中,通过数据源获取数据库连接对象 数据库连接池(pool):管理数据库连接对象 四种数据源: 1)<!-- 基于jdk的规范数据源 ...

  3. QM[中控群控云控]01. 中控原理

    QM[中控群控云控]01. 中控原理 虽然自己对于中控有了解 也自己做过一些简单中控 不过看看紫猫老师的思路 应该有很多帮助和提高 中控核心:数据交流而已 脚本端和服务端之间的信息交换 ------个 ...

  4. RTT学习之sensor设备

    Sensor设备的常用操作: 首先查找传感器设置获取设备句柄.rt_device_find 以轮询.FIFO.中断.任意一种方式打开传感器,中断和FIFO需要设置接收回调函数(释放一个信号量给接收线程 ...

  5. Centos7下载和安装教程

    https://blog.csdn.net/qq_42570879/article/details/82853708 阿里下载64bit镜像:http://mirrors.aliyun.com/cen ...

  6. NAT穿透的方式

    目前主要的NAT类型有如下几种: 1)Full-cone NAT, also known as one-to-one NAT 一旦一个内网地址 (iAddr:iPort) 被映射到一个外部地址 (eA ...

  7. Vue-全局变量和方法

    一.单文件引入 1.创建存放全局变量和方法的vue文件 Common.uve <script> const userName = 'yangjing'; function add(a,b) ...

  8. 「WC2013」糖果公园

    「WC2013」糖果公园 传送门 树上带修莫队板子题. 看懂题意后就是板子题了. 参考代码: #include <algorithm> #include <cstdio> #i ...

  9. JavaScirpt - 模块的写法

    传送门 http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 1. 原始写法 function f1() { // do sth. ...

  10. 在centos 7中安装phpmyadmin

    安装phpmyadmin数据库管理系统 //1.下载phpmyadmin包wget https://files.phpmyadmin.net/phpMyAdmin/4.7.0/phpMyAdmin-4 ...