你可能会好奇为什么只有一个 BFS 的标签,却还能够排到 F 的位置。

因为它实在是太 简 单 了

有更新


首先,比较两个数,可以先比较两个数的长度,然后比较两个数看成数字串后的字典序。

不妨先把每条边拆成更多条边(中间加虚点),比如 233 拆成一条三条边的链,权分别是 2,3,3。

对于长度,根据 BFS 的性质,肯定是长度短的先访问。所以接下来只用稍微注意一下字典序。

其实也很简单:对每个出点,按照边权从小到大排序。可以证明访问到的点的答案(没取模)是单调不降的。

有个小细节:对于一些答案相同的点在队列里面,可能有一个更优的转移是从后面的点转移得到的。然而对于大多数代码(也可能只是我的)是只会访问一次(就像普通 BFS 一样),就把前面不够优的转移选了。

那么可以把答案相同的点一起处理,然后先枚举所有 0 边,再枚举所有 1 边……。

如何判断两个点答案相同?直接比复杂度就挂了,答案是取模过的看起来也一副不能比的样子。

然而……我不会了,所以我直接比了,然后就过了?

求证明/hack……

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int maxn=1337337,mod=1000000007;
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,m,cnt,h,r,q[maxn],ans[maxn];
vector<int> e[maxn][10];
bool vis[maxn],ch[maxn];
int main(){
cnt=n=read();m=read();
FOR(i,1,m){
int u=read(),v=read();
int tmp=i,pre=v;
while(tmp>9){
e[++cnt][tmp%10].push_back(pre);
tmp/=10;pre=cnt;
}
e[u][tmp].push_back(pre);
tmp=i;pre=u;
while(tmp>9){
e[++cnt][tmp%10].push_back(pre);
tmp/=10;pre=cnt;
}
e[v][tmp].push_back(pre);
}
q[h=r=1]=1;
vis[1]=true;
ans[1]=0;
while(h<=r){
int L=h,R=0;
FOR(i,h+1,r) if(ch[q[i]]){R=i-1;break;}
if(!R) R=r;
FOR(j,0,9) FOR(i,L,R){
int u=q[i];
FOR(k,0,(int)e[u][j].size()-1){
int v=e[u][j][k];
if(vis[v]) continue;
vis[v]=true;
ans[v]=(10ll*ans[u]+j)%mod;
if(ans[q[r]]!=ans[v]) ch[v]=true;
q[++r]=v;
}
}
h=R+1;
}
FOR(i,2,n) printf("%d\n",ans[i]);
}

upd:会真做法了。直接看代码,懒得说了。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int maxn=1337337,mod=1000000007;
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,m,cnt,h,r,q[maxn],ans[maxn];
vector<int> e[maxn][10];
bool vis[maxn],ch[maxn];
int main(){
cnt=n=read();m=read();
FOR(i,1,m){
int u=read(),v=read();
int tmp=i,pre=v;
while(tmp>9){
e[++cnt][tmp%10].push_back(pre);
tmp/=10;pre=cnt;
}
e[u][tmp].push_back(pre);
tmp=i;pre=u;
while(tmp>9){
e[++cnt][tmp%10].push_back(pre);
tmp/=10;pre=cnt;
}
e[v][tmp].push_back(pre);
}
q[h=r=1]=1;
vis[1]=true;
ans[1]=0;
while(h<=r){
int L=h,R=0;
FOR(i,h+1,r) if(ch[q[i]]){R=i-1;break;}
if(!R) R=r;
FOR(j,0,9){
int hhh=0;
FOR(i,L,R){
int u=q[i];
FOR(k,0,(int)e[u][j].size()-1){
int v=e[u][j][k];
if(vis[v]) continue;
vis[v]=true;
ans[v]=(10ll*ans[u]+j)%mod;
if(++hhh!=1) ch[v]=true;
q[++r]=v;
}
}
}
h=R+1;
}
FOR(i,2,n) printf("%d\n",ans[i]);
}

CF1207F Koala and Notebook(BFS)的更多相关文章

  1. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  2. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  3. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  4. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  9. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

随机推荐

  1. servlet重点知识总结

    Servlet Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. ...

  2. 微信小程序开发练习

    微信小程序开发工具git管理 https://blog.csdn.net/qq_36672905/article/details/82887102 这个开发工具的界面和交互真的是熟悉又友好,吹爆他

  3. Redis 笔记整理:回收策略与 LRU 算法

    Redis的回收策略 noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外) allkeys-lru: 尝试回收最少使用的键(L ...

  4. IT兄弟连 HTML5教程 HTML5的曲折发展过程 浏览器之间的大战

    播放电影和音乐要使用播放器,浏览网页就需要使用浏览器.浏览器虽然只是一个设备,并不是开发语言,但在Web开发中必不可少,因为浏览器要去解析HTML5.CSS3和JavaScript等语言用于显示网页, ...

  5. Unity 利用Cinemachine快速创建灵活的相机系统

    在第一或第三人称ACT和FPS游戏中,相机的运动需求是多种多样的,Unity内置的Cinemachine包可以助你快速实现不同相机功能,例如范围追踪,边界设置等. 例如,考虑这样一个功能,这在很多游戏 ...

  6. 详解JAVA8Stream API {全}

    1: 概述 1.1 优势 1.2 与传统迭代器的区分 1.3 流的操作类型分为两种: 2:流的构造与转换 2:1 常见构造 2.2: 三大包装类型的构造 2.3 并行流的规则输出 2.4 流的转换 3 ...

  7. Protractor-引入Cucumber

    上一篇博文中我们已经在package.json中写入了cucumber依赖库,在执行 npm install 之后,cucumber就已经下载好了.接下来要做的是修改conf.js,请参考下图: 去年 ...

  8. clientHeight—scrollHeight—offsetHeight三者的区别

    clientHeight,scrollHeight,offsetHeight 这三个dom属性有时让人觉得相似但又不相似 以前对它们的理解也有一些模糊,现在总结一下,方便以后复习 clientHeig ...

  9. git报错:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig

    在给git设置用户名和邮箱的时候报下面的错误:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig看提示的意思是git ...

  10. WPF 启动页面 (原发布 csdn 2017-06-26 19:26:01)

    如果我写的有误,请及时与我联系,我立即改之以免继续误导他/她人. 如果您有好的想法或者建议,请随时与我联系. wpf软件启动时,加载启动页面.软件初始化完成之后关闭页面. App.xaml.cs代码 ...