题目

给出n个点,m条有权边,现对于每一条边,你需要回答出包含这条边的最小生成树的总边权值。

分析

首先我们可以构造一个对于这n个点,m条有权边的最小生成树,显然,这是一棵最小的生成树。

那么这棵生成树的边的答案就是这棵生成树的总边权。

然后,就要考虑这棵生成树的其他边了。

在这棵生成树上,如果我们给它加一条新的边,那么,一定会形成一个环。

所以,我们把这个环中最大的边(当然不是新加入的边啦)删掉,这棵新树的总边权就是答案。

怎样删掉这个环中最大的边呢?

发现,实际上就是删掉加入的新边的两个顶点在原树上的路径上最大的边,那么就可以打倍增lca找到最大的边。(想打树链剖分也可以,不拦你)

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
const long long mo=1000000007;
const long long N=200006;
using namespace std;
long long ans[N],way[N][3],n,m,fa[N],sum,bef[N],last[N*2],next[N*2],to[N*2],f[N][20],g[N][20],tot,v[N*2],deep[N];
void bj(long long x,long long y,long long z)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
v[tot]=z;
}
void q(long long l,long long r)
{
long long i=l,j=r,mid=way[(l+r)/2][0],e;
while(i<j)
{
while(way[i][0]<mid) i++;
while(way[j][0]>mid) j--;
if(i<=j)
{
e=way[i][0];
way[i][0]=way[j][0];
way[j][0]=e;
e=way[i][1];
way[i][1]=way[j][1];
way[j][1]=e;
e=way[i][2];
way[i][2]=way[j][2];
way[j][2]=e;
e=bef[j];
bef[j]=bef[i];
bef[i]=e;
i++;
j--;
}
}
if(i<r) q(i,r);
if(l<j) q(l,j);
}
long long get(long long x)
{
if(fa[x]==x) return x;
fa[x]=get(fa[x]);
return fa[x];
}
void dg(long long x,long long y)
{
for(long long i=last[x];i;i=next[i])
{
long long j=to[i];
if(j!=y)
{
deep[j]=deep[x]+1;
g[j][0]=x;
f[j][0]=v[i];
dg(j,x);
}
}
}
long long lca(long long x,long long y)
{
long long l;
if(deep[x]<=deep[y])
{
l=x;
x=y;
y=l;
}
long long p=0;
for(long long i=log2(n);i>=0;i--)
{
if(deep[g[x][i]]>=deep[y])
{
p=max(p,f[x][i]);
x=g[x][i];
}
}
for(long long i=log2(n);i>=0;i--)
{
if(g[x][i]!=g[y][i])
{
p=max(p,max(f[x][i],f[y][i]));
x=g[x][i];
y=g[y][i];
}
}
if(x!=y) p=max(p,max(f[x][0],f[y][0]));
return p;
}
int main()
{
freopen("street.in","r",stdin);
freopen("street.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&way[i][1],&way[i][2],&way[i][0]);
fa[i]=i;
bef[i]=i;
}
q(1,m);
long long k=0;
sum=0;
for(long long i=1;i<=m,k<n-1;i++)
{
long long x=get(way[i][1]);
long long y=get(way[i][2]);
if(x==y) continue;
k++;
ans[bef[i]]=1;
bj(way[i][1],way[i][2],way[i][0]);
bj(way[i][2],way[i][1],way[i][0]);
sum+=way[i][0];
fa[x]=y;
}
deep[1]=1;
dg(1,0);
for(long long i=1;i<=log2(n);i++)
for(long long j=1;j<=n;j++)
{
g[j][i]=g[g[j][i-1]][i-1];
f[j][i]=max(f[j][i-1],f[g[j][i-1]][i-1]);
}
for(long long i=1;i<=m;i++)
{
if(!ans[bef[i]])
{
ans[bef[i]]=sum-lca(way[i][1],way[i][2])+way[i][0];
}
else
ans[bef[i]]=sum;
}
for(long long i=1;i<=m;i++)
printf("%lld\n",ans[i]);
}

Stree的更多相关文章

  1. jQuery可拖拽排序列表jquery-sortable-lists

    jquery-sortable-lists可以通过鼠标进行拖动排列树型菜单,可以定义某个列表元素是否拖动,拖动后回调,点击可以折叠树型结点,可以用来在后台模仿wordpress后台拖动菜单,实现多级菜 ...

  2. HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

    http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...

  3. UVa 712 S树

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. javascript 设计模式-----策略模式

    在<javascript设计模式>中,作者并没有向我们介绍策略模式,然而它却是一种在开发中十分常见的设计模式.最常见的就是当我们遇到一个复杂的表单验证的时候,常常需要编写一大段的if和el ...

  5. ps, top, pstree

    ps 查看当前终端所启动的进程, 不加选项只查看当前终端的进程 PID TTY TIME CMD 2398 pts/1 00:00:00 bash 3625 pts/1 00:00:00 ps #PI ...

  6. SQL复习

    1.select SELECT LastName,FirstName FROM Persons SELECT * FROM Persons 2.distinct SELECT DISTINCT Com ...

  7. HYSBZ 1588 营业额统计

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意:详见题面,中文 思路:平衡树的模板题. 可用Treap,Splay,Scape ...

  8. FTP客户端上传下载Demo实现

    1.第一次感觉MS也有这么难用的MFC类: 2.CFtpFileFind类只能实例化一个,多个实例同时查找会出错(因此下载时不能递归),采用队列存储目录再依次下载: 3.本程序支持文件夹嵌套上传下载: ...

  9. Criteria查询数据

    Criteria介绍: Criteria查询是Hibernate提供的一种查询方式,与HQL基于字符串的查询形式完全不同.Hibernate提供了org.hiberanee.Criteria 接口.o ...

随机推荐

  1. 2.k8s.Pod生命周期,健康检查

    #Pod生命周期,健康检查 pod创建过程 Init容器 就绪探测 存活探测 生命周期钩子 #Pod创建过程 master节点:kubectl -> kube-api -> kubenle ...

  2. 【算法与数据结构】二叉堆和优先队列 Priority Queue

    优先队列的特点 普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同: 最大优先队列:优先级最高的元素先出队 最小优先队列:优先级最低的元素先出队 优先队列可以用下面几种数据结 ...

  3. ARTS-3

    ARTS的初衷 Algorithm:主要是为了编程训练和学习.每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard).进行编程训练,如果不训练你看再多的算法 ...

  4. Python3 多线程编程 threading模块

    性能自动化测试除了用jmeter还可以用python threading模块做 一.threading模块定义 Python 2.4中包含的较新的线程模块为线程提供了更强大的高级支持. 线程模块公开线 ...

  5. angulart 常用

    angular: 使用 echarts npm install echarts --save // 安装declare const echarts: any; // 引入https://www.ech ...

  6. Centos7 搭建pptp服务器

    1.检查是否支持pptp 返回ok即表示支持 modprobe ppp-compress-18 && echo ok 2.安装ppp yum install -y ppp 3.安装pp ...

  7. 安装开发环境vs2017+sql2016+tfs2017

    安装开发环境vs2017+sql2016+tfs2017 编写人:左丘文 2019-7-16 近一年了,一直没空着手写点什么,跟大家交待下吧,去年一次机会,其实也不完全是去年,因此离开了我工作15年的 ...

  8. PHP 如何实现页面静态化

    页面静态化分为两种 一种伪静态,即url重写,一种纯静态化. 一.静态化的优点: 1有利于搜索引擎收录网站页面的信息:搜索引擎更喜欢静态的,更变于抓取,搜索引擎SEO排名会更容易提高. 2静态网页化网 ...

  9. Selenium1.0与2.0介绍

    Selenium的实现原理 首先,你要明确刚才建立的测试用例是基于Selenium 2.0,也就是Selenium + WebDriver的方案.其次,你需要知道,对Selenium而言,V1.0和V ...

  10. num1,随堂笔记(3月10日)

    1.计算机发展史(略) 2.我们所使用的计算机包括了计算机硬件.操作系统和应用程序与网络. 3.计算机硬件构成---CPU(运算器和控制器).内存.硬盘.输入设备和输出设备. ①CPU是计算机的主要计 ...