CodeForces 1307D BFS最短路 思维
题意
- 给出一个简单无向图,边权全部为1,同时给我们k个特殊点,要求我们从这k个特殊点中选出两个来连一条边权为1的边。同时,我们的决策要保证1~n的最短路程最大,求最终这个最短路长度。
思路
首先因为边权都为1,所以我们可以BFS来求出最短路。而且可以顺带求出所有点的d1(1到i的路程)和d2(i到n的路程)
然后考虑如果连接i,j点,那么最终结果就是 \(min(d1[i] + d2[j] + 1, d1[n])\), 不过要注意的是,这里必须有 \(d1[i] + d2[j] \le d1[j] + d2[i]\),否则结果不符合最短路的定义。
因为n很大,所以我们需要一个低于n^2时间复杂度的算法,那么首先我们要将二维枚举优化为一维。这里可以看到
\]
可以化为
\]
- 那么我们可以按照这个变形后的式子来对点进行排序。然后可知,后面的点的d2总是可以和前面的点的d1配对,所以我们从前往后扫描,同时用同一个变量来维护d1的最大值即可得到答案。
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 200000;
int n, k, m;
int fir[N + 5], nex[N * 2 + 5], vv[N * 2 + 5];
bool fl[N + 5];
struct ab
{
int v[2];
int l;
bool operator < (const struct ab& c) const
{
return v[0] - v[1] < c.v[0] - c.v[1];
}
} dis[N + 5];
int ff[N + 5];
void bfs(int s, int l)
{
queue<int> qq;
qq.push(s);
dis[s].v[l] = 0;
while (!qq.empty())
{
int cc = qq.front();
qq.pop();
for (int i = fir[cc]; i; i = nex[i])
{
if (dis[vv[i]].v[l] == -1)
{
dis[vv[i]].v[l] = dis[cc].v[l] + 1;
qq.push(vv[i]);
}
}
}
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
memset(dis, -1, sizeof(dis));
for (int i = 1; i <= n; ++i)
{
dis[i].l = i;
ff[i] = i;
}
for (int i = 1; i <= k; ++i)
{
int x;
scanf("%d", &x);
fl[x] = true;
}
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &vv[i + m], &vv[i]);
nex[i] = fir[vv[i + m]];
fir[vv[i + m]] = i;
nex[i + m] = fir[vv[i]];
fir[vv[i]] = i + m;
}
bfs(1, 0);
bfs(n, 1);
int cc = dis[n].v[0];
sort(dis + 1, dis + 1 + n);
int ans = 0;
int l1 = 1;
while (!fl[dis[l1].l])
{
++l1;
}
int mx = dis[l1].v[0];
for (int i = l1 + 1; i <= n; ++i)
{
if (fl[dis[i].l])
{
ans = max(mx + dis[i].v[1], ans);
mx = max(dis[i].v[0], mx);
}
}
printf("%d\n", min(ans + 1, cc));
return 0;
}
CodeForces 1307D BFS最短路 思维的更多相关文章
- World Tour CodeForces - 667D (bfs最短路)
大意: 有向图, 求找4个不同的点ABCD, 使得d(A,B)+d(D,C)+d(C,A)最大
- POJ 2251 Dungeon Master (BFS最短路)
三维空间里BFS最短路 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路
题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...
- 【bzoj1189】[HNOI2007]紧急疏散evacuate BFS最短路+动态加边网络流
题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以 ...
- BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)
BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...
- UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)
题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...
- Codeforces 954D Fight Against Traffic(BFS 最短路)
题目链接:Fight Against Traffic 题意:有n个点个m条双向边,现在给出两个点S和T并要增加一条边,问增加一条边且S和T之间距离不变短的情况有几种? 题解:首先dfs求一下S到其他点 ...
- [codeforces 1037D] Valid BFS? 解题报告(验证bfs序,思维题)
题目链接:http://codeforces.com/problemset/problem/1037/D 题目大意: 给出一棵树,询问一个序列是否可能为这棵树从节点1开始遍历的bfs序 题解: 对于每 ...
- Codeforces 813C The Tag Game (BFS最短路)
<题目链接> 题目大意:A.B两人在一颗树上,A在根节点1上,B在节点x上,现在他们轮流走,每次只能走一步,或者不走.A以尽可能靠近B的方式行走,B以尽可能远离A的方式走,B先开始走.问你 ...
- HDU2433 BFS最短路
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
随机推荐
- java实现 微信公众号推送消息 ,cv 就可运行!!!
一,注册公众号 1,官网地址:申请测试公众号 地址: 微信公众平台 (qq.com) 文档地址:微信开放文档 (qq.com) 2,注册后可以查看自己的appId 和 appsecret 3,创建模板 ...
- CCF PTA&中国科教工作者协会联合认证
首页 项目简介 条例规定 通知公告 组织机构 服务中心 联系我们 登录|注册 当前位置:首页 > 新闻动态 开放报名:CCF PTA&中国科教工作者协会联合认证 发布时间: 2023-0 ...
- 使用Blazor构建投资回报计算器
本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本博客中创建的投资计算器根据存入金额和回报率计算每个投资周期的特定回报 ...
- 虹科分享|虹科Redis企业版数据库带你跑赢MySQL数字时代!
数字革命悄然爆发,数据库也将成为率先破局的关键技术! 借着互联网爆发的东风,前几年MySQL以其过硬的产品能力及开源优势,一度成为全球最受欢迎的关系型数据库.然而,革命的漫长之路才刚开始,MySQL是 ...
- 【matplotlib 实战】--热力图
热力图,是一种通过对色块着色来显示数据的统计图表.它通过使用颜色编码来表示数据的值,并在二维平面上呈现出来.热力图通常用于显示大量数据点的密度.热点区域和趋势. 绘图时,一般较大的值由较深的颜色表示, ...
- 后缀自动机 (SAM) 的构造及应用
cnblogs 怎么又炸了. 为什么又可爱又强的 xxn 去年 9 月就会的科技樱雪喵现在还不会呢 /kel. 感觉 SAM 的教程已经被前人写烂了啊.那就写点个人学习过程中对 SAM 的理解. 参考 ...
- 不可复制的PDF转成双层可复制PDF
有些PDF是通过扫描或者虚拟打印机生成的,这些PDF不可复制里边的内容 市面上的工具一般都是收费或者有水印,所以就萌生了自己搞一个的想法: 使用了以下三个开源库 PdfiumViewer PDF预览及 ...
- Java Exception最佳实践(转)
https://www.dubby.cn/detail.html?id=9033 1.异常介绍 2.Java中的异常介绍 3.自定义异常 4.几个建议 1)不要生吞异常 2)申明具体的异常 3)尽可能 ...
- JavaScript 语法:流程控制语句
作者:WangMin 格言:努力做好自己喜欢的每一件事 JavaScript流程控制语句的三种基本结构:顺序结构,选择结构,循环结构 顺序结构 从上到下执行的代码就是顺序结构,程序默认就是由上到下顺序 ...
- java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)
报错信息:java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符) 解决方案:如下 1.file --> p ...