题意:给定一个n个点m条边的无向图,边权分别为1-m,从起点1出发,每经过一条边就把边权以字符串的形式加入末尾,求到达其他每个点的最小字符串(长度不同的短的更小,否则字典序小的更小)。

思路很巧妙,将每个边按照边权的位数拆成若干条虚边+若干个虚点,然后以1为起点进行BFS,边权相同的放在一起处理,这样就能保证每个点第一次到达的路径是字符串最小的路径了。

边权排序可以用基排,因为只能取0-9,常数很小。

注意各种细节。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+,inf=0x3f3f3f3f,mod=1e9+;
int hd[N],ne,n,m,dp[N],tot,buf[N],C[];
struct E {int u,v,c,nxt;} e[N<<];
void addedge(int u,int v,int c) {e[ne]= {u,v,c,hd[u]},hd[u]=ne++;}
queue<int> q;
vector<int> vec,vec2;
int upd(int u,int x) {
if(!~dp[u]) {dp[u]=x,q.push(u); return ;}
return ;
}
void bfs() {
memset(dp,-,sizeof dp);
while(q.size())q.pop();
upd(,),q.push(-);
while(q.size()) {
vec.clear();
for(; q.front()!=-; q.pop())vec.push_back(q.front());
q.pop();
vec2.clear();
for(int u:vec)for(int i=hd[u]; ~i; i=e[i].nxt)vec2.push_back(i);
for(int i=; i<=; ++i)C[i]=;
for(int i=; i<vec2.size(); ++i)++C[e[vec2[i]].c];
for(int i=; i<=; ++i)C[i]+=C[i-];
for(int i=; i<vec2.size(); ++i)buf[--C[e[vec2[i]].c]]=vec2[i];
for(int i=,j,k; i<vec2.size(); i=j) {
for(j=i; j<vec2.size()&&e[buf[j]].c==e[buf[i]].c; ++j);
int f=;
for(k=i; k<j; ++k)if(upd(e[buf[k]].v,((ll)dp[e[buf[k]].u]*+e[buf[k]].c)%mod))f=;
if(f)q.push(-);
}
}
}
int main() {
memset(hd,-,sizeof hd),ne=;
scanf("%d%d",&n,&m);
tot=n;
for(int i=; i<=m; ++i) {
int u,v;
scanf("%d%d",&u,&v);
int c=i;
if(c/) {
addedge(++tot,u,c%),addedge(++tot,v,c%),c/=;
for(; c/; c/=)++tot,addedge(tot,tot-,c%),++tot,addedge(tot,tot-,c%);
addedge(v,tot-,c),addedge(u,tot,c);
} else addedge(u,v,c),addedge(v,u,c);
}
bfs();
for(int i=; i<=n; ++i)printf("%d\n",dp[i]);
return ;
}

CodeForces - 1209F Koala and Notebook(拆边+BFS)的更多相关文章

  1. Codeforces 1209F. Koala and Notebook

    传送门 考虑到达某个点时的数长度要尽量短,那么可以把边长看成此边十进制下的位数 那么对于最终答案我们只要考虑最短路 $DAG$ 上的情况 又发现其实边长都很小,所以可以暴力拆边,把边权都拆成 $1$, ...

  2. CF1207F Koala and Notebook(BFS)

    你可能会好奇为什么只有一个 BFS 的标签,却还能够排到 F 的位置. 因为它实在是太 简 单 了 有更新 首先,比较两个数,可以先比较两个数的长度,然后比较两个数看成数字串后的字典序. 不妨先把每条 ...

  3. 1209F - Koala and Notebook

    这场比赛没打,看同学fst了,于是来看看. 这道题看似简单,但是没想清楚细节真的不太行.像现在熬到十一点左右,脑子真的不行. 首先显然位数越小越好,因为每一位要比较,不如拆点.此时要拆成两条有向链(开 ...

  4. Codeforces Gym 100187E E. Two Labyrinths bfs

    E. Two Labyrinths Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/prob ...

  5. CodeForces - 516B Drazil and Tiles(bfs)

    https://vjudge.net/problem/CodeForces-516B 题意 在一个n*m图中放1*2或者2*1的长方形,问是否存在唯一的方法填满图中的‘.’ 分析 如果要有唯一的方案, ...

  6. CodeForces - 616C(很有意思的bfs,set,map的使用)

    传送门: http://codeforces.com/problemset/problem/616/C C. The Labyrinth time limit per test 1 second me ...

  7. CodeForces - 580C Kefa and Park 【BFS】

    题目链接 http://codeforces.com/problemset/problem/580/C 题意 根节点是 1 然后所有的叶子结点都是饭店 从根节点到叶子结点的路径上 如果存在 大于m 个 ...

  8. Codeforces 659F Polycarp and Hay【BFS】

    有毒,自从上次选拔赛(哭哭)一个垃圾bfs写错之后,每次写bfs都要WA几发...好吧,其实也就这一次... 小白说的对,还是代码能力不足... 非常不足... 题目链接: http://codefo ...

  9. Codeforces 677D Vanya and Treasure 暴力+BFS

    链接 Codeforces 677D Vanya and Treasure 题意 n*m中有p个type,经过了任意一个 type=i 的各自才能打开 type=i+1 的钥匙,最初有type=1的钥 ...

随机推荐

  1. 记:倍福(CP2611 Control Panel)了解

    型号:CP2611 Control Panel Multitouch 11 为啥选型?嗯!因为不了解,了解了,作为只运行.net客户端窗体程序,谁会选用他,不是说他不好,反而相反,他是很优秀的嵌入式集 ...

  2. 手写k-means算法

    作为聚类的代表算法,k-means本属于NP难问题,通过迭代优化的方式,可以求解出近似解. 伪代码如下: 1,算法部分 距离采用欧氏距离.参数默认值随意选的. import numpy as np d ...

  3. 【VS开发】CTimeSpan类

    CTimeSpan类.        日期和时间类简介        CTime类的对象表示的时间是基于格林威治标准时间(GMT)的.CTimeSpan类的对象表示的是时间间隔.        CTi ...

  4. so的封装和使用

    背景 在linux平台下,要实现函数的封装,一般采用的是so动态库的形式 实现了函数的封装就意味着实现过程的隐藏 可以实现跨平台和跨语言的使用 实施步骤 生成so动态库 编写相应的c文件代码,实现函数 ...

  5. Sql Service 存储过程、触发器

    if exists (select * from sysobjects where name='tb_admin') drop table tb_admin go create table tb_ad ...

  6. Angular中引入外部js的使用方式

    在Angular中我们或许会用到部分外部插件的时候,像Bootstrap,Jquery这些当然我们可以通过Npm安装包的形式引入,但是还有一些其它的js库需要引入的话,我们又应该怎样操作呢? 在这里做 ...

  7. 查找担保圈-step3-获取担保圈路径

    USE [test] GO /****** Object: StoredProcedure [dbo].[p01_get_group_path] Script Date: 2019/7/8 14:40 ...

  8. selenium爬虫后上传数据库。

    一.准备工作 1.1安装软件 安装python.安装谷歌浏览器.将chromedriver.exe放到指定位置.放到Scripts文件夹中.我这边的路径为:C:\Users\1\AppData\Loc ...

  9. Shell脚本编程(一)

    shell 脚本编程(一) 1 . shell 的作用 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一 ...

  10. 批量删除Maven本地仓库中未下载完成的jar包(不完整的jar包)

    1.删除repository库目录下所有后缀名是.lastUpdated的文件 2.进入maven本地仓库地址: CMD进入windows的路径(或在仓库目录的地址栏直接输入CMD,回车自动打开); ...