Advertisement
YEZAELP

SMMR-198: Pakiny & C-Distance

May 20th, 2021
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using lli = long long;
  5. const int N = 1e5;
  6. using pi = pair <int, int>;
  7. vector <pi> g[N+10];
  8. int dis[N+10], qs[N+10], d[N+10];
  9. bool vs[N+10], node[N+10];
  10. int n, m, c;
  11.  
  12. int Cnt(int u){
  13.     if(vs[u]) return 0;
  14.     vs[u] = true;
  15.     int cnt = 1;
  16.     for(auto vw: g[u]){
  17.         int v = vw.first;
  18.         int w = vw.second;
  19.         if(w >= c) continue;
  20.         cnt += Cnt(v);
  21.     }
  22.     return cnt;
  23. }
  24.  
  25. bool cpn[N+10];
  26. void Cpn(int u){
  27.     if(cpn[u]) return;
  28.     cpn[u] = true;
  29.     for(auto vw: g[u]){
  30.         int v = vw.first;
  31.         int w = vw.second;
  32.         if(cpn[v]) continue;
  33.         Cpn(v);
  34.     }
  35. }
  36.  
  37. int main(){
  38.  
  39.     scanf("%d%d%d", &n, &m, &c);
  40.  
  41.     for(int i=1;i<=m;i++){
  42.         int u, v, w;
  43.         scanf("%d%d%d", &u, &v, &w);
  44.         if(w > c) continue;
  45.         g[u].push_back({v, w});
  46.         g[v].push_back({u, w});
  47.         if(w == c) node[v] = node[u] = true;
  48.     }
  49.  
  50.     for(int u=1;u<=n;u++){
  51.         if(node[u]) dis[u] = Cnt(u);
  52.     }
  53.     lli ans = 0;
  54.     for(int u=1;u<=n;u++){
  55.         if(node[u]){
  56.             Cpn(u);
  57.             int sz = 0;
  58.             for(int i=1;i<=n;i++){
  59.                 if(cpn[i] and node[i]){
  60.                     d[sz] = dis[i];
  61.                     sz ++;
  62.                 }
  63.             }
  64.  
  65.             qs[sz-1] = d[sz-1];
  66.             for(int i=sz-2;i>=0;i--)
  67.                 qs[i] = qs[i+1] + d[i];
  68.             for(int i=0;i<sz-1;i++)
  69.                 ans += (lli) d[i] * qs[i+1];
  70.             for(int i=1;i<=n;i++)
  71.                 if(cpn[i]) cpn[i] = node[i] = false;
  72.         }
  73.     }
  74.  
  75.     printf("%lld\n", ans);
  76.  
  77.     return 0;
  78. }
  79. /**
  80.  
  81. 10 11 4
  82. 1 2 4
  83. 3 2 4
  84. 4 2 3
  85. 5 2 5
  86. 4 6 5
  87. 5 6 4
  88. 5 9 2
  89. 9 10 1
  90. 8 9 4
  91. 7 8 7
  92. 4 7 6
  93.  
  94. */
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement