题面

链接

描述

桃子现在有一张无向无自环无重边的图,图上有N个点和M条边,现在他想知道,如果固定一条边,再来求一个图上的最小生成树,并且在使得在最小生成树根为1的情况下,新的生成树移动的点数最多。

生成树:任意两个点连通,并且任意两个点之间有且仅有一条路径。

生成树权值和:生成树每一条边的权值w总和。

最小生成树:满足生成树的前提下,权值和w最小。

自环:u和v相同。

重边:(1,2)和(1,2)。

输入

第一行两个正整数N,M(1<=N<=10^5,N-1<=M<=10^5),代表点数和边数。

接下来M条边,(u,v,w),(1<=u,v<=N,1<=w<=10^9),代表u和v之间有一条w长度的边。

数据保证所有生成树存在,并且权值w各不相同。

输出

输出M行,每行输出两个数,第一个数代表固定一条边的生成树权值和,第二个数是最多有多少个点需要跟着移动,两个数之间用空格隔开。

样例输入

4 4
1 2 40
2 3 20
1 4 30
2 4 50

样例输出

90 0
90 0
90 0
100 2

提示

样例中最小生成树连的边为(1,2,40)和(2,3,20)和(1,4,30)。

固定(1,2,10)和(2,3,20)和(1,4,30)时新的生成树未发生变化。

固定(2,4,50)时新的最小生成树中最多变化的情况是2接到4下,此时变化了两个点,2和3。

思路

首先嘛这个题意就该死的买看懂,什么叫做新的生成树移动的点数嘛

不过当你会写了自然就懂了(阿哲

先搞出最小生成树嘛,如果选定最小生成树上的边自然没影响

如果选定的不是最小生成树上的边,我们不考虑重新建树,而是改造最小生成树

相当于加入了一条边 (u, v, w) ,那么树上就会形成一个环

因为最小生成树上的边已经是最优的(边权各不相同,不存在并列最优)

所以不可能改动其他边,最优的做法是删掉环上边权最大的边,使得剩余的还是树

那么这个环就是 u, v 以及他俩一直沿父亲向上到 最近公共祖先 的环

此时我们再看这波加边删边改变了什么,什么叫做新的生成树移动的点数

稍微作图即可发现移动的点就是删除的那条边下面的那个子树

(自己作图自己意会)

以上这些操作可以用树剖或者树上倍增实现(当然是选择倍增啦

复杂度 O((n+m)logn)

代码