Advertisement
Dang_Quan_10_Tin

E-DsuRollback

Sep 12th, 2020
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #define BIT(i, x) (((x) >> (i) ) & 1)
  7. #define task "cnt-mst"
  8. using namespace std;
  9. using ll = long long;
  10. using ld = long double;
  11.  
  12. const int N = 3e5 + 2;
  13. const ll mod = 998244353;
  14. int n, m, cnt(0);
  15. vector<pair<int, int>> snap;
  16. int par[N];
  17. struct Edge
  18. {
  19.     int u, v;
  20.     ll w;
  21.     bool operator < (const Edge &a) const
  22.     {
  23.         return w < a.w;
  24.     }
  25. } s[N];
  26.  
  27. void Read()
  28. {
  29.     cin >> n;
  30.     cin >> n >> m;
  31.     for(int i = 1; i <= m; ++i)
  32.         cin >> s[i].u >> s[i].v >> s[i].w;
  33.     sort(s + 1, s + m + 1);
  34. }
  35.  
  36. int findpar(int v)
  37. {
  38.     return par[v] < 0 ? v : findpar(par[v]);
  39. }
  40.  
  41. void Merge(int a, int b)
  42. {
  43.     if(par[a] < par[b])
  44.         swap(a, b);
  45.     --cnt;
  46.     snap.emplace_back(a, par[a]);
  47.     par[b] += par[a];
  48.     par[a] = b;
  49. }
  50.  
  51. void Rollback(int cur)
  52. {
  53.     while(cur--)
  54.     {
  55.         ++cnt;
  56.         pair<int, int> a = snap.back();
  57.         snap.pop_back();
  58.         par[par[a.first]] -= a.second;
  59.         par[a.first] = a.second;
  60.     }
  61. }
  62.  
  63. void Solve()
  64. {
  65.     memset(par, -1, sizeof par);
  66.     ll ans = 1;
  67.     cnt = n;
  68.     for(int i = 1; i <= m; ++i)
  69.     {
  70.         int j = i;
  71.         while(j <= m && s[j].w == s[i].w)
  72.             ++j;
  73.         int now = 0;
  74.         for(int t = i; t < j; ++t)
  75.         {
  76.             int u = findpar(s[t].u),
  77.                 v = findpar(s[t].v);
  78.             if(u != v)
  79.                 Merge(u, v),
  80.                       ++now;
  81.         }
  82.         int cur = cnt;
  83.         Rollback(now);
  84.         ll res = 0;
  85.         for(int t = 0; t < (1 << (j - i)); ++t)
  86.         {
  87.             now = 0;
  88.             bool ck = 1;
  89.             for(int h = i; h < j; ++h)
  90.                 if(BIT(h - i, t))
  91.                 {
  92.                     int u = findpar(s[h].u),
  93.                         v = findpar(s[h].v);
  94.                     if(u != v)
  95.                     {
  96.                         Merge(u, v);
  97.                         ++now;
  98.                     }
  99.                     else
  100.                         ck = 0;
  101.                 }
  102.             ck &= cnt == cur;
  103.             if(ck) ++res;
  104.             Rollback(now);
  105.         }
  106.         for(int t = i; t < j; ++t)
  107.         {
  108.             int u = findpar(s[t].u),
  109.                 v = findpar(s[t].v);
  110.             if(u != v)
  111.                 Merge(u, v);
  112.         }
  113.         //cerr << cnt << "\n";
  114.         ans = ans * res % mod;
  115.         i = j - 1;
  116.     }
  117.     cout << ans;
  118. }
  119.  
  120. int main()
  121. {
  122.     ios_base::sync_with_stdio(false);
  123.     cin.tie(0);
  124.     cout.tie(0);
  125.     if(fopen(task".INP", "r"))
  126.     {
  127.         freopen(task".INP","r",stdin);
  128.         freopen(task".OUT","w",stdout);
  129.     }
  130.     Read();
  131.     Solve();
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement