Solution -「CF 575G」Run for beer
\(\mathcal{Description}\)
Link.
给定 \(n\) 个点 \(m\) 条边的无向图,边有边权,一个人初始速度为 \(1\),每走一条边速度 \(\div10\),求从 \(1\) 走到 \(n\) 的最小耗时。
\(n,m\le10^5\),\(0\le\text{边权}\le9\)。
\(\mathcal{Solution}\)
直观地,路径长度即为把经过的边权从低位到高位写成的十进制数。
首先排除前导 \(0\)——把从终点出发,仅走边权为 \(0\) 的边可达的结点全部与终点缩点。此时的最短路需要保证路径条数最少的前提下保证字典序最小。BFS 分层,维护当前层外围最优的一堆结点,用它们向下层扩展直到到达起点。
\(\mathcal{Code}\)
#include <queue>
#include <cstdio>
#include <vector>
const int MAXN = 2e5, MAXM = 2e5;
int n, m, ecnt, head[MAXN + 5], d[MAXN + 5], suf[MAXN + 5];
bool vis[MAXN + 5];
std::vector<int> curp, nxtp;
std::queue<int> que;
struct Edge { int to, cst, nxt; } graph[MAXM * 2 + 5];
inline void link ( const int s, const int t, const int c ) {
graph[++ ecnt] = { t, c, head[s] };
head[s] = ecnt;
}
inline void initReach () {
for ( int i = 1; i <= n; ++ i ) d[i] = -1;
d[1] = 0, que.push ( 1 );
for ( int u; ! que.empty (); ) {
u = que.front (), que.pop ();
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ! ~ d[v = graph[i].to] ) {
d[v] = d[u] + 1, que.push ( v );
}
}
}
}
inline int zeroReach () {
int mind = d[n];
curp.push_back ( n ), vis[n] = true;
for ( int cur = 0; cur ^ curp.size (); ++ cur ) {
int u = curp[cur];
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( ! vis[v = graph[i].to] && ! graph[i].cst ) {
curp.push_back ( v ), vis[v] = true, suf[v] = u;
if ( mind > d[v] ) mind = d[v];
}
}
}
return mind;
}
int main () {
scanf ( "%d %d", &n, &m );
for ( int i = 1, u, v, w; i <= m; ++ i ) {
scanf ( "%d %d %d", &u, &v, &w ), ++ u, ++ v;
link ( u, v, w ), link ( v, u, w );
}
initReach ();
int dist = zeroReach ();
bool zero = true;
for ( int l = dist; l; -- l ) {
int dig = 10;
for ( int u: curp ) {
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( d[v = graph[i].to] + 1 == l && graph[i].cst < dig ) {
dig = graph[i].cst;
}
}
}
if ( dig ) zero = false;
if ( l == 1 || ! zero ) putchar ( dig ^ '0' );
for ( int u: curp ) {
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( d[v = graph[i].to] + 1 == l && graph[i].cst == dig && ! vis[v] ) {
vis[v] = true, nxtp.push_back ( v ), suf[v] = u;
}
}
}
curp = nxtp, nxtp.clear ();
}
if ( zero ) putchar ( '0' );
int ans = 1, u;
for ( u = 1; u ^ n; ++ ans, u = suf[u] );
printf ( "\n%d\n0", ans ), u = 1;
do printf ( " %d", ( u = suf[u] ) - 1 ); while ( u ^ n );
putchar ( '\n' );
return 0;
}
Solution -「CF 575G」Run for beer的更多相关文章
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 1237E」Balanced Binary Search Trees
\(\mathcal{Description}\) Link. 定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...
- Solution -「CF 599E」Sandy and Nuts
\(\mathcal{Description}\) Link. 指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...
随机推荐
- 解决spring boot 无法访问静态文件夹的附件或图片
1.需要在配置文件重新执行静态文件夹位置即可 # 指定静态文件位置 resources: static-locations: classpath:/static/,classpath:/static/ ...
- sublime text 3 添加packagecontrol
打开sublime控制台输入 import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee1 ...
- 利用js模拟用户的cookie信息保存
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6814761849708347907/ 默认已完成爬虫文档<爬虫学习文档顺序> 并简单搭建完展示页面和管 ...
- docker安装easymock
一.准备 参考docker安装mongodb与redis文章 二.拉取 docker pull docker.io/easymock/easymock 三.启动 1.创建配置目录 mkdir -f / ...
- uni-app、小程序之swiper-item内容过多显示不全的解决方案
原文 最近在项目遇到swiper高度不能自适应,导致swiper-item 里面的内容过多时只能显示一部分,最终解决方案: <swiper> <swiper-item> < ...
- uniapp 判断 IOS和Android的GPS是否开启并设置启动
checkOpenGPSServiceByAndroidIOS() { let system = uni.getSystemInfoSync(); // 获取系统信息 console.log(syst ...
- 友善之臂mini2440光盘资料下载FriendlyARM-2440-DVD.7z
这是我目前找到最全面的友善之臂mini2440的光盘资料了,几乎支持mini2440的各种lcd屏幕.另外,Windows平台工具文件夹下还有版本比较新的MiniTools,这是一个非常好用的软件! ...
- 二维数组与稀疏数组的转换---dataStructures
首先我们看一个需求 在11 * 11 的五子棋的棋盘中 我们使用0代表十字交叉点也是无效的数据 用1代表黑棋 用2代表蓝棋 那么所看到的棋盘如下 改用数字显示后就如一下样式 现在我们需要将怎个棋盘存储 ...
- 听说你想在 WordPress 网站上嵌入 PPT ?
年底了,想在 WordPress 博客上展示自己的春节旅行计划,尝试在文章中插入一个旅行计划 PPT 结果长这个样子 你有没有遇到同样的情况,懊恼网页支持展示的内容无法满足我们的需求: 想展示年度家庭 ...
- SnackBar--FloatingActionButton--CoordinatorLayout
SnackBar snack:小吃,点心,快餐 btOpenSnackBar = (Button) findViewById(R.id.bt_openSnackBar); btOpenSnackBar ...