\(\mathcal{Description}\)

  Link.

  给定 \(n\) 个点 \(m\) 条边的无向图,边有边权,一个人初始速度为 \(1\),每走一条边速度 \(\div10\),求从 \(1\) 走到 \(n\) 的最小耗时。

  \(n,m\le10^5\),\(0\le\text{边权}\le9\)。

\(\mathcal{Solution}\)

  直观地,路径长度即为把经过的边权从低位到高位写成的十进制数。

  首先排除前导 \(0\)——把从终点出发,仅走边权为 \(0\) 的边可达的结点全部与终点缩点。此时的最短路需要保证路径条数最少的前提下保证字典序最小。BFS 分层,维护当前层外围最优的一堆结点,用它们向下层扩展直到到达起点。

\(\mathcal{Code}\)

  1. #include <queue>
  2. #include <cstdio>
  3. #include <vector>
  4. const int MAXN = 2e5, MAXM = 2e5;
  5. int n, m, ecnt, head[MAXN + 5], d[MAXN + 5], suf[MAXN + 5];
  6. bool vis[MAXN + 5];
  7. std::vector<int> curp, nxtp;
  8. std::queue<int> que;
  9. struct Edge { int to, cst, nxt; } graph[MAXM * 2 + 5];
  10. inline void link ( const int s, const int t, const int c ) {
  11. graph[++ ecnt] = { t, c, head[s] };
  12. head[s] = ecnt;
  13. }
  14. inline void initReach () {
  15. for ( int i = 1; i <= n; ++ i ) d[i] = -1;
  16. d[1] = 0, que.push ( 1 );
  17. for ( int u; ! que.empty (); ) {
  18. u = que.front (), que.pop ();
  19. for ( int i = head[u], v; i; i = graph[i].nxt ) {
  20. if ( ! ~ d[v = graph[i].to] ) {
  21. d[v] = d[u] + 1, que.push ( v );
  22. }
  23. }
  24. }
  25. }
  26. inline int zeroReach () {
  27. int mind = d[n];
  28. curp.push_back ( n ), vis[n] = true;
  29. for ( int cur = 0; cur ^ curp.size (); ++ cur ) {
  30. int u = curp[cur];
  31. for ( int i = head[u], v; i; i = graph[i].nxt ) {
  32. if ( ! vis[v = graph[i].to] && ! graph[i].cst ) {
  33. curp.push_back ( v ), vis[v] = true, suf[v] = u;
  34. if ( mind > d[v] ) mind = d[v];
  35. }
  36. }
  37. }
  38. return mind;
  39. }
  40. int main () {
  41. scanf ( "%d %d", &n, &m );
  42. for ( int i = 1, u, v, w; i <= m; ++ i ) {
  43. scanf ( "%d %d %d", &u, &v, &w ), ++ u, ++ v;
  44. link ( u, v, w ), link ( v, u, w );
  45. }
  46. initReach ();
  47. int dist = zeroReach ();
  48. bool zero = true;
  49. for ( int l = dist; l; -- l ) {
  50. int dig = 10;
  51. for ( int u: curp ) {
  52. for ( int i = head[u], v; i; i = graph[i].nxt ) {
  53. if ( d[v = graph[i].to] + 1 == l && graph[i].cst < dig ) {
  54. dig = graph[i].cst;
  55. }
  56. }
  57. }
  58. if ( dig ) zero = false;
  59. if ( l == 1 || ! zero ) putchar ( dig ^ '0' );
  60. for ( int u: curp ) {
  61. for ( int i = head[u], v; i; i = graph[i].nxt ) {
  62. if ( d[v = graph[i].to] + 1 == l && graph[i].cst == dig && ! vis[v] ) {
  63. vis[v] = true, nxtp.push_back ( v ), suf[v] = u;
  64. }
  65. }
  66. }
  67. curp = nxtp, nxtp.clear ();
  68. }
  69. if ( zero ) putchar ( '0' );
  70. int ans = 1, u;
  71. for ( u = 1; u ^ n; ++ ans, u = suf[u] );
  72. printf ( "\n%d\n0", ans ), u = 1;
  73. do printf ( " %d", ( u = suf[u] ) - 1 ); while ( u ^ n );
  74. putchar ( '\n' );
  75. return 0;
  76. }

Solution -「CF 575G」Run for beer的更多相关文章

  1. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  2. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  3. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  4. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  5. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  6. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  7. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  8. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  9. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

随机推荐

  1. CentOS7 安装mysql并解决安装慢的问题

    0.centOS7 mini版安装及网络配置 //可从我的网盘保存下载,可用虚拟机安装 链接:https://pan.baidu.com/s/10_AHxN0DtJ75s1oFOaaZ3A 密码:ud ...

  2. ubuntu 升级node和npm 版本

    使用vue-cli 3 构建项目时会一直卡在拉取依赖不动,原因是node和npm版本过低,升级node版本即可 $ sudo npm cache clean -f $ sudo npm install ...

  3. JAVA自定义连接池原理设计(一)

    一,概述 本人认为在开发过程中,需要挑战更高的阶段和更优的代码,虽然在真正开发工作中,代码质量和按时交付项目功能相比总是无足轻重.但是个人认为开发是一条任重而道远的路.现在本人在网上找到一个自定义连接 ...

  4. SSRF服务器端请求伪造漏洞基础

    0x00 思考 1.什么是SSRF漏洞?2.SSRF漏洞的利用方式3.SSRF漏洞绕过4.SSRF漏洞加固 0x01 什么是SSRF漏洞 定义:SSRF漏洞,中文全称为服务端请求伪造漏洞,是一种由攻击 ...

  5. JVM调优2-远程监控

    监控远程JVM VisualJVM不仅是可以监控本地jvm进程,还可以监控远程的jvm进程,需要借助于JMX技术实现. 什么是JMX JMX(Java Management Extensions,即J ...

  6. 【Java常用类】两个Date类

    两个Date类 java.util.Date类 两个构造器的使用 构造器一:Date():创建一个对应当前时间的Date对象 构造器二:创建指定毫秒数的Date对象 两个方法的使用 toString( ...

  7. Hybrid App(混合开发) 移动端开发调试

    1.下载项目,npm install安装依赖 本地运行 npm run dev(根据具体packjson配 置而定) 2.局域网访问:http://172.20.9.35:8080/ 3.手机端访问: ...

  8. React教程

    教程 一.demo <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> &l ...

  9. golang反射reflect机制用法

    package main import ( "fmt" "reflect" ) type User struct { Id int Name string Ag ...

  10. 解决Post请求中文乱码问题

    解决Post请求中文乱码问题 req.setChracterEncoding()要在获取请求参数前调用才有效,不然还是乱码