fork download
  1. /*
  2. * @Author: hungeazy
  3. * @Date: 2025-10-21 09:24:36
  4. * @Last Modified by: hungeazy
  5. * @Last Modified time: 2025-10-21 14:20:05
  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)2e5+10;
  54. int n,m;
  55. vii g[N];
  56. array<int,3> edge[N];
  57. map<ii,int> val;
  58.  
  59. namespace sub1 {
  60.  
  61. int par[N][20],h[N],lo[N];
  62.  
  63. bool approved() {
  64. return m == n-1;
  65. }
  66.  
  67. void DFS(int u, int p)
  68. {
  69. for (auto [v,w] : g[u])
  70. if (v != p)
  71. {
  72. par[v][0] = u;
  73. h[v] = h[u]+1;
  74. DFS(v,u);
  75. }
  76. }
  77.  
  78. void init()
  79. {
  80. lo[1] = 0;
  81. FOR(i,2,N-10) lo[i] = lo[i/2]+1;
  82. FOR(j,1,lo[n])
  83. FOR(i,1,n)
  84. par[i][j] = par[par[i][j-1]][j-1];
  85. }
  86.  
  87. int LCA(int x, int y)
  88. {
  89. if (h[x] < h[y]) swap(x,y);
  90. int z = lo[n];
  91. FOD(i,z,0)
  92. if (h[x]-h[y] >= MASK(i)) x = par[x][i];
  93. if (x == y) return x;
  94. FOD(i,z,0)
  95. if (par[x][i] != par[y][i])
  96. {
  97. x = par[x][i];
  98. y = par[y][i];
  99. }
  100. return par[x][0];
  101. }
  102.  
  103. void solve(void)
  104. {
  105. DFS(1,-1);
  106. init();
  107. vi vec,vec2;
  108. int u = 1, v = n, lca = LCA(u,v);
  109. while (u != lca)
  110. {
  111. vec.pb(u);
  112. u = par[u][0];
  113. }
  114. while (v != lca)
  115. {
  116. vec2.pb(v);
  117. v = par[v][0];
  118. }
  119. vec2.pb(lca);
  120. reverse(all(vec2));
  121. for (int x : vec2) vec.pb(x);
  122. int pre = 0, ans = 0;
  123. FOR(i,0,sz(vec)-2)
  124. {
  125. ans += abs(val[{vec[i],vec[i+1]}]-pre);
  126. pre = val[{vec[i],vec[i+1]}];
  127. }
  128. cout << ans;
  129. }
  130.  
  131. }
  132.  
  133. namespace sub2 {
  134.  
  135. int d[N][11];
  136.  
  137. bool approved() {
  138. FOR(i,1,m)
  139. if (edge[i][2] > 10) return false;
  140. return true;
  141. }
  142.  
  143. void Dijkstra(int p)
  144. {
  145. FOR(i,1,n)
  146. FOR(j,1,10) d[i][j] = oo;
  147. d[p][0] = 0;
  148. priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>> q;
  149. q.push({0,p,0});
  150. while (!q.empty())
  151. {
  152. auto [cost,u,W] = q.top();
  153. q.pop();
  154. if (cost > d[u][W]) continue;
  155. for (auto [v,w] : g[u])
  156. if (minimize(d[v][w],d[u][W]+abs(w-W)))
  157. q.push({d[v][w],v,w});
  158. }
  159. }
  160.  
  161. void solve(void)
  162. {
  163. Dijkstra(1);
  164. int ans = oo;
  165. FOR(i,1,10) minimize(ans,d[n][i]);
  166. cout << ans;
  167. }
  168.  
  169. }
  170.  
  171. namespace sub3 {
  172.  
  173. unordered_map<int,int> d;
  174.  
  175. bool approved() {
  176. FOR(i,1,m)
  177. if (edge[i][2] > 10) return false;
  178. return true;
  179. }
  180.  
  181. int convert(int x, int y) {
  182. return (x<<31LL)+y;
  183. }
  184.  
  185. void Dijkstra(int p)
  186. {
  187. d[convert(p,0)] = 0;
  188. priority_queue<array<int,3>,vector<array<int,3>>,greater<array<int,3>>> q;
  189. q.push({0,p,0});
  190. while (!q.empty())
  191. {
  192. auto [cost,u,W] = q.top();
  193. q.pop();
  194. if (u == n)
  195. {
  196. cout << cost;
  197. return;
  198. }
  199. if (cost > d[convert(u,W)]) continue;
  200. for (auto [v,w] : g[u])
  201. if (!d.count(convert(v,w)) or minimize(d[convert(v,w)],d[convert(u,W)]+abs(w-W)))
  202. {
  203. d[convert(v,w)] = d[convert(u,W)]+abs(w-W);
  204. q.push({d[convert(v,w)],v,w});
  205. }
  206. }
  207. }
  208.  
  209. void solve(void)
  210. {
  211. Dijkstra(1);
  212. }
  213.  
  214. }
  215.  
  216. namespace sub4 {
  217.  
  218. vii G[N];
  219. vi adj[N];
  220. int d[N];
  221.  
  222. void Dijkstra(int p)
  223. {
  224. FOR(i,0,m) d[i] = oo;
  225. d[p] = 0;
  226. priority_queue<ii,vii,greater<ii>> q;
  227. q.push({0,p});
  228. while (!q.empty())
  229. {
  230. auto [cost,u] = q.top();
  231. q.pop();
  232. if (cost > d[u]) continue;
  233. for (auto [v,w] : G[u])
  234. if (minimize(d[v],d[u]+w))
  235. q.push({d[v],v});
  236. }
  237. }
  238.  
  239. void solve(void)
  240. {
  241. FOR(i,1,m)
  242. {
  243. auto [u,v,w] = edge[i];
  244. adj[u].pb(i); adj[v].pb(i);
  245. }
  246. FOR(i,1,n)
  247. {
  248. if (sz(adj[i]) <= 1) continue;
  249. sort(all(adj[i]),[&](int x, int y) {
  250. return edge[x][2] < edge[y][2];
  251. });
  252. FOR(j,1,sz(adj[i])-1)
  253. {
  254. int u = adj[i][j-1], v = adj[i][j];
  255. int w = abs(edge[u][2]-edge[v][2]);
  256. G[u].pb({v,w}); G[v].pb({u,w});
  257. }
  258. }
  259. FOR(i,1,m)
  260. if (edge[i][0] == 1 or edge[i][1] == 1)
  261. G[0].pb({i,edge[i][2]});
  262. Dijkstra(0);
  263. int ans = oo;
  264. FOR(i,1,m)
  265. if (edge[i][0] == n or edge[i][1] == n)
  266. minimize(ans,d[i]);
  267. cout << ans;
  268. }
  269.  
  270. }
  271.  
  272. bool M2;
  273. signed main()
  274. {
  275. fast;
  276. if (fopen(name".inp","r"))
  277. {
  278. freopen(name".inp","r",stdin);
  279. freopen(name".out","w",stdout);
  280. }
  281. cin >> n >> m;
  282. FOR(i,1,m)
  283. {
  284. int u,v,w;
  285. cin >> u >> v >> w;
  286. g[u].pb({v,w}); g[v].pb({u,w});
  287. edge[i] = {u,v,w};
  288. val[{u,v}] = val[{v,u}] = w;
  289. }
  290. if (sub1::approved()) return sub1::solve(), time(), memory(), 0;
  291. if (sub2::approved()) return sub2::solve(), time(), memory(), 0;
  292. if (sub3::approved()) return sub3::solve(), time(), memory(), 0;
  293. sub4::solve();
  294. time();
  295. memory();
  296. return 0;
  297. }
  298. // ██░ ██ █ ██ ███▄ █ ▄████
  299. //▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
  300. //▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
  301. //░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
  302. //░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
  303. // ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
  304. // ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
  305. // ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
  306. // ░ ░ ░ ░ ░ ░
Success #stdin #stdout #stderr 0.01s 24476KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
-------------Time:9.005ms.
70.1942 MB