fork download
  1. /*
  2. * @Author: hungeazy
  3. * @Date: 2025-11-22 17:12:38
  4. * @Last Modified by: hungeazy
  5. * @Last Modified time: 2025-11-22 17:52:14
  6. */
  7. #include <bits/stdc++.h>
  8. #include <ext/pb_ds/assoc_container.hpp>
  9. #include <ext/pb_ds/tree_policy.hpp>
  10. // #pragma GCC optimize("O3")
  11. // #pragma GCC optimize("unroll-loops")
  12. // #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
  13. using namespace std;
  14. using namespace __gnu_pbds;
  15. bool M1;
  16. #define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  17. #define int long long
  18. #define ll long long
  19. #define ull unsigned long long
  20. #define sz(x) x.size()
  21. #define sqr(x) (1LL * (x) * (x))
  22. #define all(x) x.begin(), x.end()
  23. #define fill(f,x) memset(f,x,sizeof(f))
  24. #define FOR(i,l,r) for(int i=l;i<=r;i++)
  25. #define FOD(i,r,l) for(int i=r;i>=l;i--)
  26. #define debug(x) cout << #x << " = " << x << '\n'
  27. #define ii pair<int,int>
  28. #define iii pair<int,ii>
  29. #define di pair<ii,ii>
  30. #define vi vector<int>
  31. #define vii vector<ii>
  32. #define mii map<int,int>
  33. #define fi first
  34. #define se second
  35. #define pb push_back
  36. #define MOD 1000000007
  37. #define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
  38. #define YES cout << "YES\n"
  39. #define NO cout << "NO\n"
  40. #define MASK(i) (1LL << (i))
  41. #define c_bit(i) __builtin_popcountll(i)
  42. #define BIT(x,i) ((x) & MASK(i))
  43. #define SET_ON(x,i) ((x) | MASK(i))
  44. #define SET_OFF(x,i) ((x) & ~MASK(i))
  45. #define oo 1e18
  46. #define name ""
  47. #define endl '\n'
  48. #define memory() cerr << abs(&M2-&M1)/1024.0/1024 << " MB" << endl
  49. #define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms." << endl
  50. template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
  51. template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
  52. template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
  53. const int N = (int)1e5+10;
  54. int n1,m1,n2,m2;
  55. array<int,3> edge1[N],edge2[N];
  56.  
  57. namespace sub1 {
  58.  
  59. const int M = (int)1e6+10;
  60. int par[M],sz[M];
  61.  
  62. bool approved() {
  63. return n1 <= 1e3 and m1 <= 1e3;
  64. }
  65.  
  66. struct DSU {
  67. int n;
  68.  
  69. DSU() {};
  70. DSU(int _n):
  71. n(_n) {};
  72.  
  73. void init() {
  74. FOR(i,1,n)
  75. {
  76. par[i] = i;
  77. sz[i] = 1;
  78. }
  79. }
  80.  
  81. int acs(int u) {
  82. return (u == par[u] ? u : par[u] = acs(par[u]));
  83. }
  84.  
  85. bool join(int u, int v)
  86. {
  87. int x = acs(u), y = acs(v);
  88. if (x != y)
  89. {
  90. if (sz[x] < sz[y]) swap(x,y);
  91. sz[x] += sz[y];
  92. par[y] = x;
  93. return true;
  94. }
  95. return false;
  96. }
  97. } dsu;
  98.  
  99. void solve(void)
  100. {
  101. int totNodes = n1*n2;
  102. vector<array<int,3>> edges;
  103. FOR(i,1,m1)
  104. {
  105. auto [a,b,w] = edge1[i];
  106. a--; b--;
  107. FOR(v,0,n2-1)
  108. {
  109. int id1 = a*n2+v;
  110. int id2 = b*n2+v;
  111. edges.pb({id1,id2,w});
  112. }
  113. }
  114. FOR(i,1,m2)
  115. {
  116. auto [a,b,w] = edge2[i];
  117. a--; b--;
  118. FOR(u,0,n1-1)
  119. {
  120. int id1 = u*n2+a;
  121. int id2 = u*n2+b;
  122. edges.pb({id1,id2,w});
  123. }
  124. }
  125. sort(all(edges),[&](array<int,3> &x, array<int,3> &y) {
  126. return x[2] < y[2];
  127. });
  128. dsu = DSU(totNodes);
  129. dsu.init();
  130. int tplt = totNodes, ans = 0;
  131. for (auto [u,v,w] : edges)
  132. {
  133. if (dsu.join(u,v))
  134. {
  135. ans += w;
  136. tplt--;
  137. }
  138. if (tplt == 1) break;
  139. }
  140. cout << (tplt == 1 ? ans : -1);
  141. }
  142.  
  143. }
  144.  
  145. namespace sub2 {
  146.  
  147. array<int,4> edges[N<<1];
  148. int par[N<<1],sz[N<<1];
  149.  
  150. struct DSU {
  151. int n,tplt;
  152.  
  153. DSU() {};
  154. DSU(int _n):
  155. n(_n), tplt(_n) {};
  156.  
  157. void init() {
  158. FOR(i,1,n)
  159. {
  160. par[i] = i;
  161. sz[i] = 1;
  162. }
  163. }
  164.  
  165. int acs(int u) {
  166. return (u == par[u] ? u : par[u] = acs(par[u]));
  167. }
  168.  
  169. bool join(int u, int v)
  170. {
  171. int x = acs(u), y = acs(v);
  172. if (x != y)
  173. {
  174. if (sz[x] < sz[y]) swap(x,y);
  175. sz[x] += sz[y];
  176. par[y] = x;
  177. tplt--;
  178. return true;
  179. }
  180. return false;
  181. }
  182. } dsu1,dsu2;
  183.  
  184. void solve(void)
  185. {
  186. FOR(i,1,m1)
  187. {
  188. auto [u,v,w] = edge1[i];
  189. edges[i] = {u,v,w,0};
  190. }
  191. FOR(i,1,m2)
  192. {
  193. auto [u,v,w] = edge2[i];
  194. edges[i+m1] = {u,v,w,1};
  195. }
  196. sort(edges+1,edges+m1+m2+1,[&](array<int,4> &x, array<int,4> &y) {
  197. return x[2] < y[2];
  198. });
  199. dsu1 = DSU(n1); dsu2 = DSU(n2);
  200. dsu1.init(); dsu2.init();
  201. int ans = 0;
  202. FOR(i,1,m1+m2)
  203. if (edges[i][3])
  204. {
  205. auto [u,v,w,type] = edges[i];
  206. if (dsu2.join(u,v))
  207. ans += dsu1.tplt*w;
  208. }
  209. else
  210. {
  211. auto [u,v,w,type] = edges[i];
  212. if (dsu1.join(u,v))
  213. ans += dsu2.tplt*w;
  214. }
  215. cout << ans;
  216. }
  217.  
  218. }
  219.  
  220. bool M2;
  221. signed main()
  222. {
  223. fast;
  224. if (fopen(name".inp","r"))
  225. {
  226. freopen(name".inp","r",stdin);
  227. freopen(name".out","w",stdout);
  228. }
  229. cin >> n1 >> m1;
  230. FOR(i,1,m1)
  231. {
  232. int u,v,w;
  233. cin >> u >> v >> w;
  234. edge1[i] = {u,v,w};
  235. }
  236. cin >> n2 >> m2;
  237. FOR(i,1,m2)
  238. {
  239. int u,v,w;
  240. cin >> u >> v >> w;
  241. edge2[i] = {u,v,w};
  242. }
  243. // if (sub1::approved()) return sub1::solve(), time(), memory(), 0;
  244. sub2::solve();
  245. time();
  246. memory();
  247. return 0;
  248. }
  249. // ██░ ██ █ ██ ███▄ █ ▄████
  250. //▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
  251. //▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
  252. //░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
  253. //░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
  254. // ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
  255. // ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
  256. // ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
  257. // ░ ░ ░ ░ ░ ░
Success #stdin #stdout #stderr 0.01s 5308KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
-------------Time:6.253ms.
28.9934 MB