热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【EducationalCodeforcesRound3E】【树链剖分】Minimumspanningtreeforeachedge图构最小生成树,生成树必须包含第i条边

E.Minimumspanningtreeforeachedgetimelimitpertest2secondsmemorylimitpertest256megabytes
E. Minimum spanning tree for each edgetime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard output

Connected undirected weighted graph without self-loops and multiple edges is given. Graph contains n vertices and m edges.

For each edge (u, v) find the minimal possible weight of the spanning tree that contains the edge (u, v).

The weight of the spanning tree is the sum of weights of all edges included in spanning tree.

Input

First line contains two integers n and m (1 ≤ n ≤ 2·105, n - 1 ≤ m ≤ 2·105) — the number of vertices and edges in graph.

Each of the next m lines contains three integers ui, vi, wi (1 ≤ ui, vi ≤ n, ui ≠ vi, 1 ≤ wi ≤ 109) — the endpoints of the i-th edge and its weight.

Output

Print m lines. i-th line should contain the minimal possible weight of the spanning tree that contains i-th edge.

The edges are numbered from 1 to m in order of their appearing in input.

Sample test(s)input
5 7
1 2 3
1 3 1
1 4 5
2 3 2
2 5 3
3 4 2
4 5 4
output
9
8
11
8
8
8
9


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template inline void gmin(T1 &a,T2 b){if(bconst int N=2e5+10,Z=1e9+7,ms63=0x3f3f3f3f;
int n,m;
int first[N],w[N*2],cc[N*2],nxt[N*2];
int fa[N],son[N],dep[N],size[N],pos[N],top[N];
int f[N];
struct C
{
int l,r,maxv;
}c[1<<19];
struct edgeedge
{
int x,y,z;
bool operator <(const edgeedge& b)const
{
return z}
}edge[N],M[N];
int id,tim;
int len[N];//记录每个点到其父节点的边权
int pp[N];//记录每个时间戳对应的节点
void ins(int x,int y,int z)
{
id++;
w[id]=y;
cc[id]=z;
nxt[id]=first[x];
first[x]=id;
}
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
void build(int o,int l,int r)
{
c[o].l=l;
c[o].r=r;
if(l==r)
{
c[o].maxv=len[pp[l]];
return;
}
int m=(l+r)>>1;
build(ls,l,m);
build(rs,m+1,r);
c[o].maxv=max(c[ls].maxv,c[rs].maxv);
}
void dfs1(int x)
{
size[x]=1;
son[x]=0;
for(int z=first[x];z;z=nxt[z])
{
int y=w[z];
if(y==fa[x])continue;
fa[y]=x;
len[y]=cc[z];
dep[y]=dep[x]+1;
dfs1(y);
size[x]+=size[y];
if(size[y]>size[son[x]])son[x]=y;
}
}
void dfs2(int x,int chain)
{
pos[x]=++tim;
pp[tim]=x;
top[x]=chain;
if(son[x]==0)return;
dfs2(son[x],chain);
for(int z=first[x];z;z=nxt[z])
{
int y=w[z];
if(y!=fa[x]&&y!=son[x])dfs2(y,y);
}
}
int Qmax(int o,int l,int r)
{
if(c[o].l==l&&c[o].r==r)return c[o].maxv;
int m=(c[o].l+c[o].r)>>1;
if(r<=m)return Qmax(ls,l,r);
else if(l>m)return Qmax(rs,l,r);
else return max(Qmax(ls,l,m),Qmax(rs,m+1,r));
}
int QMAX(int x,int y)
{
int maxv=-1e9;
while(top[x]!=top[y])
{
if(dep[top[x]]gmax(maxv,Qmax(1,pos[top[x]],pos[x]));
x=fa[top[x]];
}
if(pos[x]>pos[y])swap(x,y);
if(pos[x]return maxv;
}
LL MST()
{
sort(edge+1,edge+m+1);
LL sum=0;
for(int i=1;i<=m;++i)
{
int x=edge[i].x;
int y=edge[i].y;
int z=edge[i].z;
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
f[fy]=fx;
ins(x,y,z);
ins(y,x,z);
sum+=z;
}
}
return sum;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
id=0;for(int i=1;i<=n;++i){f[i]=i;first[i]=0;}
for(int i=1;i<=m;++i)scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);
MC(M,edge);
LL sum=MST();
fa[1]=0;dep[1]=0;dfs1(1);
tim=0;dfs2(1,1);
build(1,1,n);
for(int i=1;i<=m;++i)
{
LL ans=sum-QMAX(M[i].x,M[i].y)+M[i].z;
printf("%lld\n",ans);
}
}
return 0;
}
/*
【trick&&吐槽】
明明是权在边上,可是被我写成了权在点上。
本来又是可以绝杀的,然而还是跪掉了TwT

【题意】
给你一个无向连通图,n(2e5)个点,m(n-1<=m<=2e5)条边,且不存在重边和自环。
这个图显然可以有最小生成树。
我们问你,假如说我们必须要求第1~m条边是这个最小生成树上的边,那么在这个基础上会形成的最小生成树的权值是多少?

也就是说,我们有m个输出。
第i个输出,表示在我们要求第i条边必须是最小生成树上的树边的基础上,形成的最小生成树的边权和。

【类型】
树链剖分

【分析】
这道题的询问是如此之多。
我们发现,其实它们都是基于最小生成树,然后再做一点点修改而已。

于是,我们不妨先求出最小生成树。
然后,如果我们要求第i条边在这个树上,那么我们再加上第i条边,就会形成一个环。
我们想要去掉一个环,于是,我们只需要移除这个环上的任意一条边即可。

而新加的那条边(x,y),我们是不能移除的,于是,我们移除的相当于原来最小生成树链(x,y)上的任一条边。
显然,为了实现最小生成树的构成,我们会选择移除其中边权最大的那条边。

于是,只要实现—— 树链剖分,权在边上,链上最大边 的功能,这道题就可以AC啦。

【时间复杂度&&优化】
O(mlognlogn)


*/



推荐阅读
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
author-avatar
霸气的饭桶丶_130
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有