不用管时间复杂度洛谷数据不会T,麻烦dalao看一下那WA了QWQ
#define ll long long
int n, m;
ll ans;
vci g[1000005], e[1000005];
int dcc, dfn[1000005], low[1000005], sz[1000005], tot, f[1000005];
stack<int> st;
void tarjan(int u){
dfn[u] = low[u] = ++tot;
st.push(u);
for(int v : g[u]){
if(!dfn[v]){
tarjan(v);
if(dfn[u] <= low[v]){
dcc++;
while(1){
int t = st.top();
st.pop();
e[dcc + n].psb(t);
e[t].psb(dcc + n);
if(t == v) break;
}
e[dcc + n].psb(u);
e[u].psb(dcc + n);
}
}
else low[u] = min(low[u], dfn[v]);
}
}
void dfs1(int u, int ft){
f[u] = ft;
sz[u] = (u <= n);
for(int v : e[u])
if(v != ft){
dfs1(v, u);
sz[u] += sz[v];
}
}
void dfs2(int u, ll cnt){
for(int v : e[u])
for(int w : e[v])
if(w != u){
if(v != f[u]) dfs2(w, cnt);
if(w != f[f[u]]) ans += (ll)(cnt - 1 - sz[w]) * sz[w];
else ans += (ll)(cnt - 1 - (cnt - sz[v])) * (cnt - sz[v]);
}
}
signed main(){
srand(time(0));
cin >> n >> m;
while(m--){
int a, b;
cin >> a >> b;
g[a].psb(b);
g[b].psb(a);
}
for(int i = 1; i <= n; i++)
if(!dfn[i]){
tarjan(i);
dfs1(i, 0);
dfs2(i, sz[i]);
}
cout << ans;
return 0;
}