题目

思路

先求只用王牌电缆的最小生成树

再选一条李牌电缆替换王牌电缆

使答案最小就完了

假如要替换的李牌电缆两端点是 \(u,v\)

那么生成树中 \(u \Longrightarrow lca(u,v)\) 和 \(v \Longrightarrow lca(u,v)\) 这两条链中的权值最大的边就是要替换的边

类似于次小生成树

倍增维护就好了

注意,有可能只用王牌电缆无法构成最小生成树

这里特判一下,此时跑最小生成树最终的结果必然是两个不连通的集合

这使枚举的李牌电缆就要使它们联通,求一个最小的李牌电缆即可

#include<cstdio>
#include<algorithm>
using namespace std; const int N = 2e5 + 5;
int n , W , L , h[N] , fa[N] , tot , vis[N] , size[N] , lw , lid , hl;
int f[N][20] , anc[N][20] , ind[N][20] , dep[N] , ans , s , rt; struct edge{
int nxt , to , w , id;
}e[N << 1]; struct Edge{
int u , v , w , id;
}E[N]; struct Edge1{
int u , v , w;
}l[N]; inline void addedge(int u , int v , int w , int id)
{
e[++tot] = (edge){h[u] , v , w , id};
h[u] = tot;
} inline bool cmpE(Edge x , Edge y){return x.w < y.w;}
inline int find(int x){return fa[x] == x ? x : fa[x] = find(fa[x]);} inline bool merge(int x , int y)
{
int xx = find(x) , yy = find(y);
if (fa[xx] != fa[yy])
{
if (size[xx] < size[yy]) fa[xx] = fa[yy] , size[yy] += size[xx];
else fa[yy] = fa[xx] , size[xx] += size[yy];
return 1;
}
return 0;
} inline void Kruskal()
{
int u , v , w;
for(register int i = 1; i <= W; i++)
scanf("%d%d%d" , &E[i].u , &E[i].v , &E[i].w) , E[i].id = i;
sort(E + 1 , E + W + 1 , cmpE);
for(register int i = 1; i <= n; i++) fa[i] = i , size[i] = 1;
for(register int i = 1; i <= W; i++)
{
if (merge(E[i].u , E[i].v))
{
ans += E[i].w , s++;
vis[E[i].id] = 1;
addedge(E[i].u , E[i].v , E[i].w , E[i].id);
addedge(E[i].v , E[i].u , E[i].w , E[i].id);
if (!rt) rt = E[i].u;
}
if (s == n - 1) break;
}
} inline void dfs(int x , int father)
{
for(register int i = 1; i <= 17; i++)
if (f[x][i - 1])
{
f[x][i] = f[f[x][i - 1]][i - 1];
if (anc[x][i - 1] < anc[f[x][i - 1]][i - 1])
anc[x][i] = anc[f[x][i - 1]][i - 1] , ind[x][i] = ind[f[x][i - 1]][i - 1];
else anc[x][i] = anc[x][i - 1] , ind[x][i] = ind[x][i - 1];
}
else break; for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == father) continue;
f[v][0] = x , dep[v] = dep[x] + 1 , anc[v][0] = e[i].w , ind[v][0] = e[i].id;
dfs(v , x);
}
} inline void update(int ll , int u , int v)
{
if (dep[u] < dep[v]) swap(u , v);
int deep = dep[u] - dep[v] , sum;
int t = -0x3f3f3f3f , id;
for(register int i = 0; i <= 17; i++)
if (deep & (1 << i))
{
if (t < anc[u][i]) t = anc[u][i] , id = ind[u][i];
u = f[u][i];
}
if (u == v)
{
sum = ans - t + l[ll].w;
if (sum < lw) lw = sum , lid = ll , hl = id;
return;
}
for(register int i = 17; i >= 0; i--)
if (f[u][i] != f[v][i])
{
if (t < anc[u][i]) t = anc[u][i] , id = ind[u][i];
if (t < anc[v][i]) t = anc[v][i] , id = ind[v][i];
u = f[u][i] , v = f[v][i];
}
if (t < anc[u][0]) t = anc[u][0] , id = ind[u][0];
if (t < anc[v][0]) t = anc[v][0] , id = ind[v][0]; sum = ans - t + l[ll].w;
if (sum < lw) lw = sum , lid = ll , hl = id;
} inline void getans()
{
for(register int i = 1; i <= L; i++) scanf("%d%d%d" , &l[i].u , &l[i].v , &l[i].w);
if (s != n - 1)
{
int Min = 0x3f3f3f3f , ld = 0;
for(register int i = 1; i <= L; i++)
if (find(l[i].u) != find(l[i].v) && l[i].w < Min)
Min = l[i].w , ld = i;
printf("%d\n" , ans + Min);
for(register int i = 1; i <= W; i++)
if (vis[i]) printf("%d\n" , i);
printf("%d\n" , ld);
return;
}
dfs(rt , 0);
lw = 0x3f3f3f3f;
for(register int i = 1; i <= L; i++) update(i , l[i].u , l[i].v);
printf("%d\n" , lw) , vis[hl] = 0;
for(register int i = 1; i <= W; i++)
if (vis[i]) printf("%d\n" , i);
printf("%d\n" , lid);
} int main()
{
freopen("telephone.in" , "r" , stdin);
freopen("telephone.out" , "w" , stdout);
scanf("%d%d%d" , &n , &W , &L);
Kruskal();
getans();
}

JZOJ 4313. 【NOIP2015模拟11.4】电话线铺设的更多相关文章

  1. [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告

    题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...

  2. JZOJ 4298. 【NOIP2015模拟11.2晚】我的天

    4298. [NOIP2015模拟11.2晚]我的天 (File IO): input:ohmygod.in output:ohmygod.out Time Limits: 1000 ms Memor ...

  3. 【NOIP2015模拟11.5】JZOJ8月5日提高组T2 Lucas的数列

    [NOIP2015模拟11.5]JZOJ8月5日提高组T2 Lucas的数列 题目 PS:\(n*n*T*T<=10^{18}\)而不是\(10^1*8\) 题解 题意: 给出\(n\)个元素的 ...

  4. 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃

    [NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...

  5. 【NOIP2015模拟11.2晚】JZOJ8月4日提高组T2 我的天

    [NOIP2015模拟11.2晚]JZOJ8月4日提高组T2 我的天 题目 很久很以前,有一个古老的村庄--xiba村,村子里生活着n+1个村民,但由于历届村长恐怖而且黑暗的魔法统治下,村民们各自过着 ...

  6. 【NOIP2015模拟11.4】JZOJ2020年8月6日提高组T2 最优交换

    [NOIP2015模拟11.4]JZOJ2020年8月6日提高组T2 最优交换 题目 题解 题意 有一个长度为\(n\)的正整数 最多可以进行\(k\)次操作 每次操作交换相邻两个位置上的数 问可以得 ...

  7. 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划

    [NOIP2015模拟11.4]JZOJ8月6日提高组T1 刷题计划 题目 题解 题意 有\(n\)道题,编号为1~\(n\) 给出\(m\)次操作 每次操作有3种类型 1 \(x\) 表示交了\(A ...

  8. 【NOIP2015模拟11.5】JZOJ8月5日提高组T3 旅行

    [NOIP2015模拟11.5]JZOJ8月5日提高组T3 旅行 题目 若不存在第\(k\)短路径时,输出"Stupid Mike" 题解 题意 给出一个有\(n\)个点的树 问这 ...

  9. 【NOIP2015模拟11.3】备用钥匙

    题目 你知道Just Odd Inventions社吗?这个公司的业务是"只不过是奇妙的发明(Just Odd Inventions)".这里简称为JOI社. JOI社有N名员工, ...

  10. JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝

    Description

随机推荐

  1. Halo 主题 Redemption 首发版

    Redemption 一款专注阅读.写作的 Halo 博客主题.主要设计思想即是专注阅读.写作,是一款极简类型的博客主题. Redemption 部分设计灵感借鉴 Halo 博客 Zozo 主题,感谢 ...

  2. TKE 超级节点,Serverless 落地的最佳形态

    陈冰心,腾讯云产品经理,负责超级节点迭代与客户拓展,专注于 TKE Serverless 产品演进. 背景 让人又爱又恨的 Serverless Serverless 炙手可热,被称为云原生未来发展的 ...

  3. JavaScript笔记之面向对象

    面向对象 了解构造函数原型对象的语法特征,掌握 JavaScript 中面向对象编程的实现方式,基于面向对象编程思想实现 DOM 操作的封装. 了解面向对象编程的一般特征 掌握基于构造函数原型对象的逻 ...

  4. 网络I/O模型 解读

    网络.内核 网卡能「接收所有在网络上传输的信号」,但正常情况下只接受发送到该电脑的帧和广播帧,将其余的帧丢弃. 所以网络 I/O 其实是网络与服务端(电脑内存)之间的输入与输出 内核 查看内核版本 : ...

  5. supervisor安装与监控nginx

    安装参考:https://www.cnblogs.com/zgcblog/p/10192077.html https://www.cnblogs.com/yangbo981205/p/14928897 ...

  6. Zabbix与乐维监控对比分析(二)——Agent管理、自动发现、权限管理

    上期我们详细介绍了Zabbix与乐维监控的架构与性能对比分析,透过架构与性能对比分析,用户可以对乐维监控之所以能成为"Zabbix企业版"有一个初步的认知.本篇是Zabbix对比乐 ...

  7. PostgreSQL常用操作合辑:时间日期、系统函数、正则表达式、库表导入导出、元数据查询、自定义函数、常用案例

    〇.参考地址 1.pg官方文档 http://www.postgres.cn/docs/9.6/index.html 2.腾讯云仓pg文档 https://cloud.tencent.com/docu ...

  8. 10-排序6 Sort with Swap(0, i) (25point(s))

    10-排序6 Sort with Swap(0, i) (25point(s)) Given any permutation of the numbers {0, 1, 2,..., N−1}, it ...

  9. Flaks框架(Flask请求响应,session,闪现,请求扩展,中间件,蓝图)

    目录 一:Flask请求响应 1.请求相关信息 2.flask新手四件套 3.响应相关信息(响应response增加数据返回) 二:session 1.session与cookie简介 2.在使用se ...

  10. ping localhost时出现::1的原因以及解决办法

    ping localhost时出现: 在cmd中ping localhost解析出来的是ipv6的::1的原因是windows有个优先解析列表,当ipv6的优先级高于ipv4时,就会出现这种情况. 具 ...