Advertisement
Guest User

Untitled

a guest
Jul 20th, 2018
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.92 KB | None | 0 0
  1. /*
  2. ▄███████▀▀▀▀▀▀███████▄
  3. ░▐████▀▒ЗАПУСКАЕМ▒▀██████▄
  4. ░███▀▒▒▒▒▒ДЯДЮ▒▒▒▒▒▒▀█████
  5. ░▐██▒▒▒▒▒▒БОГДАНА▒▒▒▒▒████▌
  6. ░▐█▌▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▌
  7. ░░█▒▄▀▀▀▀▀▄▒▒▄▀▀▀▀▀▄▒▐███▌
  8. ░░░▐░░░▄▄░░▌▐░░░▄▄░░▌▐███▌
  9. ░▄▀▌░░░▀▀░░▌▐░░░▀▀░░▌▒▀▒█▌
  10. ░▌▒▀▄░░░░▄▀▒▒▀▄░░░▄▀▒▒▄▀▒▌
  11. ░▀▄▐▒▀▀▀▀▒▒▒▒▒▒▀▀▀▒▒▒▒▒▒█
  12. ░░░▀▌▒▄██▄▄▄▄████▄▒▒▒▒█▀
  13. ░░░░▄██████████████▒▒▐▌
  14. ░░░▀███▀▀████▀█████▀▒▌
  15. ░░░░░▌▒▒▒▄▒▒▒▄▒▒▒▒▒▒▐
  16. ░░░░░▌▒▒▒▒▀▀▀▒▒▒▒▒▒▒▐
  17. TAYA
  18. */
  19. #pragma GCC optimize("Ofast")
  20. #include <iostream>
  21. #include <vector>
  22. #include <string>
  23. #include <algorithm>
  24. #include <cstdio>
  25. #include <numeric>
  26. #include <cstring>
  27. #include <ctime>
  28. #include <cstdlib>
  29. #include <set>
  30. #include <map>
  31. #include <unordered_map>
  32. #include <unordered_set>
  33. #include <list>
  34. #include <cmath>
  35. #include <bitset>
  36. #include <cassert>
  37. #include <queue>
  38. #include <stack>
  39. #include <deque>
  40. #include <cassert>
  41. #include <iomanip>
  42. #include <random>
  43.  
  44.  
  45. using namespace std;
  46.  
  47.  
  48.  
  49. #define ll long long
  50. #define ld double
  51. #define null NULL
  52. #define prev prev228
  53. #define index index228
  54. #define left left228
  55. #define right right228
  56. #define hash hash228
  57. #define y1 y1228
  58. #define y0 y0228
  59. #define firn(i, n) for (int i = 0; i < (int)n; ++i)
  60. #define forn(i, n) for (int i = 1; i <= (int)n; ++i)
  61. #define int long long
  62.  
  63. template<typename T> inline void uin(T &a, T b) {
  64. if (b < a) a = b;
  65. }
  66.  
  67. template<typename T> inline void uax(T &a, T b) {
  68. if (b > a) a = b;
  69. }
  70.  
  71. const int maxn = 507, INF = 1e18 + 7;
  72.  
  73. int n, m;
  74.  
  75.  
  76. struct DSU
  77. {
  78. vector<int> p, sz;
  79.  
  80. DSU(int n) {
  81. p.resize(n + 3);
  82. sz.resize(n + 3);
  83. forn(i, n) {
  84. p[i] = i;
  85. sz[i] = 1;
  86. }
  87. }
  88.  
  89. int get_p(int v) {
  90. if (p[v] == v) return v;
  91. p[v] = get_p(p[v]);
  92. return p[v];
  93. }
  94.  
  95. void join(int u, int v) {
  96. u = get_p(u);
  97. v = get_p(v);
  98. if (u != v) {
  99. if (sz[u] < sz[v]) {
  100. p[u] = v;
  101. sz[v] += sz[u];
  102. } else {
  103. p[v] = u;
  104. sz[u] += sz[v];
  105. }
  106. }
  107. }
  108.  
  109. bool con(int u, int v) {
  110. return get_p(u) == get_p(v);
  111. }
  112. };
  113.  
  114. struct edge
  115. {
  116. int u, v, w, id;
  117. edge() {}
  118. edge(int _u, int _v, int _w, int _id) {
  119. u = _u;
  120. v = _v;
  121. w = _w;
  122. id = _id;
  123. }
  124. };
  125.  
  126. bool operator<(edge a, edge b) {
  127. return a.w < b.w;
  128. }
  129.  
  130. struct Edge
  131. {
  132. int to, w, id;
  133. Edge() {}
  134. Edge(int _to, int _w, int _id) {
  135. to = _to;
  136. w = _w;
  137. id = _id;
  138. }
  139. };
  140.  
  141.  
  142. int p[maxn], pid[maxn];
  143.  
  144. vector< Edge > g[maxn];
  145.  
  146. vector<int> cycle;
  147.  
  148.  
  149. void dfs(int v, int par = -1, int idpar = -1) {
  150. p[v] = par;
  151. pid[v] = idpar;
  152. for (auto go : g[v]) {
  153. int to = go.to;
  154. if (to != par) {
  155. dfs(to, v, go.id);
  156. }
  157. }
  158. }
  159.  
  160.  
  161. int get_lca(int u, int v) {
  162. vector<int> a, b;
  163. while (u != -1) {
  164. a.push_back(u);
  165. u = p[u];
  166. }
  167. while (v != -1) {
  168. b.push_back(v);
  169. v = p[v];
  170. }
  171. reverse(a.begin(), a.end());
  172. reverse(b.begin(), b.end());
  173. int ptr = -1;
  174. int sz = min((int)a.size(), (int)b.size());
  175. while (ptr + 1 < sz && a[ptr + 1] == b[ptr + 1]) ++ptr;
  176. return a[ptr];
  177. }
  178.  
  179.  
  180. vector<int> get(int u, int v) {
  181. int lca = get_lca(u, v);
  182. vector<int> res;
  183. while (u != lca) {
  184. res.push_back(pid[u]);
  185. u = p[u];
  186. }
  187. while (v != lca) {
  188. res.push_back(pid[v]);
  189. v = p[v];
  190. }
  191. return res;
  192. }
  193.  
  194.  
  195. signed main() {
  196. ios_base::sync_with_stdio(false);
  197. cin.tie(0);
  198. cin >> n >> m;
  199. vector< bool > used_edge(m + 1);
  200. vector< edge > e;
  201. vector<int> we(m + 1);
  202. forn(it, m) {
  203. int u, v, w;
  204. cin >> u >> v >> w;
  205. e.push_back(edge(u, v, w, it));
  206. we[it] = w;
  207. }
  208. sort(e.begin(), e.end());
  209. int res1 = 0, res2 = 0;
  210. DSU dsu = DSU(n);
  211. vector< edge > mst;
  212. for (edge ee : e) {
  213. int u = ee.u, v = ee.v, w = ee.w, id = ee.id;
  214. if (!dsu.con(u, v)) {
  215. used_edge[ee.id] = 1;
  216. dsu.join(u, v);
  217. g[u].push_back(Edge(v, w, id));
  218. g[v].push_back(Edge(u, w, id));
  219. mst.push_back(ee);
  220. res1 += w;
  221. }
  222. }
  223. dfs(1);
  224. res2 = INF;
  225. for (edge ee : e) {
  226. if (!used_edge[ee.id]) {
  227. int u = ee.u, v = ee.v, w = ee.w;
  228. int cur = res1 + w;
  229. vector<int> kek = get(u, v);
  230. int maximal = 0;
  231. for (int keke : kek) uax(maximal, we[keke]);
  232. cur -= maximal;
  233. uin(res2, cur);
  234. }
  235. }
  236. if (m < n - 1) res1 = -1;
  237. if (m <= n - 1) res2 = -1;
  238. if (res2 == INF) res2 = -1;
  239. cout << "Cost: " << res1 << "\n";
  240. cout << "Cost: " << res2 << "\n";
  241. return 0;
  242. }
  243.  
  244.  
  245.  
  246. // kek
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement