图上计数(Hard)
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

 Easy 版本和 Hard 版本唯一的区别是 Hard 版本删除的是桥,而 Easy 版本删除的是任意边。
你有一张 n 个点 m 条边的无向图,你有无数次删除操作来删除任意条以获得若干个联通块。定义联通块的大小为其所包含点个数。定义这个图的代价是:你有任意次操作,每次操作合并两个联通块,合并后联通块大小为二者之和,最后剩下两个联通块大小的乘积为此图的代价,若只有一个则代价为0。你需要最大化此图代价。
对于桥的定义:对于一个无向图,如果删掉一条边后图中的连通块数增加了,则称这条边为桥或者割边

输入描述:

第一行包含两个整数 n 和 m ,图中顶点的数量和边的数量。
接下来的每 m 行包含两个整数 u 和 v ,表示图中顶点 u 和 v 之间有一条无向边。
\left ( 0< n\leq 4\times10^{5} \right )
\left ( 0\leq m\leq 10^{6} \right )
\left ( 0< u,v\leq n \right )

输出描述:

输出一个整数表示最大代价。
示例1

输入

复制
10 12
1 2
1 3
2 3
2 4
4 5
5 6
6 7
7 4
3 8
8 9
9 10
10 8

输出

复制
24