Dang_Quan_10_Tin

EDGE(PreDH 2021)

Apr 17th, 2021 (edited)
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <vector>
  5. #define task "edge"
  6.  
  7. using namespace std;
  8. using ld = long double;
  9. using ll = long long;
  10.  
  11. const int N = 1e5 + 5;
  12. int n, m, low[N], num[N], l(0);
  13. int cnt(0), brigde(0), dp[N];
  14. ll ans(0);
  15. vector<int> adj[N], x;
  16.  
  17. void Read()
  18. {
  19.     cin >> n >> m;
  20.  
  21.     for(int i = 1; i <= m; ++i)
  22.     {
  23.         int u, v;
  24.         cin >> u >> v;
  25.  
  26.         adj[u].push_back(v);
  27.         adj[v].push_back(u);
  28.     }
  29.  
  30. }
  31.  
  32. void dfs(int v, int par = 0)
  33. {
  34.     low[v] = num[v] = ++l;
  35.  
  36.     dp[v] = 1;
  37.  
  38.     for(auto i : adj[v])
  39.         if(i != par)
  40.         {
  41.             if(!num[i])
  42.             {
  43.                 dfs(i, v);
  44.                 dp[v] += dp[i];
  45.  
  46.                 low[v] = min(low[v], low[i]);
  47.  
  48.                 if(low[i] > num[v]){
  49.                     ans += 1ll * dp[i] * (n - dp[i]) - 1;
  50.                     ++brigde;
  51.                 }
  52.                 else ans += 1ll * n * (n - 1) / 2 - m;
  53.             }
  54.             else {
  55.                 low[v] = min(low[v], num[i]);
  56.                 if(num[i] < num[v])
  57.                     ans += 1ll * n * (n - 1) / 2 - m;
  58.             }
  59.         }
  60. }
  61.  
  62. void Solve()
  63. {
  64.     for(int i = 1; i <= n; ++i)
  65.         if(!num[i])
  66.         {
  67.             dfs(i);
  68.             ++cnt;
  69.             x.push_back(i);
  70.         }
  71.  
  72.     /// special cases
  73.  
  74.     if(cnt > 2)
  75.     {
  76.         cout << 0;
  77.         return;
  78.     }
  79.     else if(cnt == 2)
  80.     {
  81.         cout << (1ll * dp[x[0]] * dp[x[1]] * (m - brigde));
  82.         return;
  83.     }
  84.  
  85.     /// normal case
  86.  
  87.     cout << ans;
  88. }
  89.  
  90. int32_t main()
  91. {
  92.     ios::sync_with_stdio(0);
  93.     cin.tie(0);
  94.     cout.tie(0);
  95.  
  96.     if(fopen(task".INP", "r"))
  97.     {
  98.         freopen(task".INP", "r", stdin);
  99.         freopen(task".OUT", "w", stdout);
  100.     }
  101.  
  102.     Read();
  103.     Solve();
  104. }
  105.  
Add Comment
Please, Sign In to add comment