#include <bits/stdc++.h>
using namespace std;
#define all(v) v.begin(),v.end()
#define pb push_back
#define ll long long
#define ld long double
#define fi first
#define se second
#define mk make_pair
typedef pair<int,int> pii;
const int maxn  = 1e5 + 10;
int i,n,t,u,v,m;
vector<int> adj[maxn],bcc[maxn],com_adj[maxn *2];
int low[maxn],tim[maxn],com_cnt,com[maxn];
stack<int> st;
bool crit[maxn];
void dfs(int i,int pa)
{
  int child = 0;
  low[i] = tim[i] = ++t;
  st.push(i);
  for(int k : adj[i])
  {
    if(k == pa)continue;
    if(tim[k])low[i]= min(low[i],tim[k]);
    else 
    {
      child++;
      dfs(k,i);
      low[i] = min(low[i],low[k]);
      
      if(pa == 0 && child >= 2)crit[i] = 1;
      if(pa && low[k] >= tim[i])crit[i] = 1;
      
      if(low[k] >= tim[i])
      {
        com_cnt++;
        while(st.top() != k)
        {
          bcc[com_cnt].pb(st.top());
          st.pop();
        }
        bcc[com_cnt].pb(st.top());
        st.pop();
        bcc[com_cnt].pb(i);
      }
    }
  }
}
ll dp[maxn*2][2];
ll s[maxn * 2],ans;
bool c[maxn*2];
void cal(int i,int pa)
{
  c[i] = 1;
  dp[i][0] = s[i];
  dp[i][1] = s[i] * (s[i]-1);
  ll tmp = 0;
  for(int k : com_adj[i])
  {
    if(k == pa)continue;
    cal(k,i);
    if(i <= n)tmp += s[k] * (s[k]-1)/2;
    tmp += dp[i][0] * dp[k][1];
    tmp += dp[i][1] * dp[k][0];
    dp[i][0] += dp[k][0];
    dp[i][1] += dp[k][1];
    dp[i][1] += s[i] * dp[k][0];
  }
  ans += tmp;
  // cout<<i<<' '<<dp[i][0]<<' '<<dp[i][1]<<' '<<tmp<<'\n';
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>n>>m;
    while(m--)
    {
      cin>>u>>v;
      adj[u].pb(v);
      adj[v].pb(u);
    }
    
    for(i = 1;i<=n;i++)
    {
      if(!tim[i])
      {
        dfs(i,0);
        if(st.size())
        {
          if(st.size() > 1)
          {
            com_cnt++;
            for(;st.size();st.pop())bcc[com_cnt].pb(st.top());
          }
          else st.pop();
        }
      }
    }
    
    for(i = 1;i<=com_cnt;i++)
    {
      for(int k : bcc[i])
      {
        if(crit[k])
        {
          com[k] = k;
          com_adj[k].pb(n+i);
          com_adj[n+i].pb(k);
          s[k] = 1;
        }
        else 
        {
          com[k] = n + i;
          s[com[k]]++;
        }
      }
    }
    
    for(i = 1;i<=n;i++)
    {
      int tmp = com[i];
      // cout<<i<<' '<<tmp<<' '<<s[tmp]<<'\n';
      if(!c[tmp])
      {
        cal(tmp,0);
      }
    }
    
    cout<<ans * 2;
    
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |