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 ...
随机推荐
- 我试图扯掉这条 SQL 的底裤。
你好呀,我是歪歪. 这次带大家盘一个我觉得有点意思的东西,也是之前写<一个烂分页,踩了三个坑!>这篇文章时,遇到的一个神奇的现象,但是当时忙着做文章搞定这个主线任务,就没有去深究这个支线任 ...
- 创建一个自己的 Linux系统
简单来说就是一个文件传递的机制,首先创建/安装一个硬盘,然后把前硬盘中的一部分文件先转移到Linux系统上,再通过Linux系统转移到创建的新硬盘,之后用虚拟机,把新硬盘装在其中,就可以在新硬盘上做到 ...
- .NET中的数组在内存中如何布局?
总的来说,.NET的值类型和引用类型都映射一段连续的内存片段.不过对于值类型对象来说,这段内存只需要存储其字段成员,而对应引用类型对象,还需要存储额外的内容.就内存布局来说,引用类型有两个独特的存在, ...
- 前端JavaScript编码规范 和react编码规范
JavaScript编码规范 点击链接查看:https://github.com/ecomfe/spec/blob/master/javascript-style-guide.md 前端React编码 ...
- java学习内容-1
java学习内容-1 (一)jdk的使用 (二)定义标识符的规则 (三)java常用类 1.String类 2.Math类 3.Integer和Double类 4.输出 5.Scanner类 例子 ( ...
- Verilog HDL数据流建模与运算符
数据流建模使用的连续赋值语句由关键词assign开始,一般用法如下: wire [位宽说明]变量名1, 变量名2, ..., 变量名n; assign 变量名 = 表达式; 只要等号右边的值发生变化, ...
- Educational Codeforces Round 118 (Rated for Div. 2) D. MEX Sequences
\(DP\)真的太难了啊!! 首先考虑到\(f(i, s)\)表示,从前\(i\)个数中选,最后一个数为\(a_i\),且\(MEX(a_1,....,a_i) = \left\{ \begin{al ...
- #ifndef、#define、#ifdef等命令在C#中的应用
1.#ifndef指令的理解 #ifndef是一个预处理指令,用于判断一个表示符是否被定义.如果该标识符未被定义,则执行条件编译中的代码块.否则,将跳过该代码块.下面是一个简单的粒子. 1 #ifnd ...
- IDEA安装与配置教程
一.下载并安装IDEA 1.下载 1.官网: 下载 IntelliJ IDEA (这里以Windows系统为例,其他系统类似) 2.安装 1.下载完成后,直接点击安装包安装,即可. 2.开始安装,然后 ...
- 在NET8中使用简化的 AddJwtBearer 认证
开发环境 系统版本: win10 .NET SDK: NET8 开发工具:vscode 参考引用:使用 dotnet user-jwts 管理开发中的 JSON Web 令牌 注意:以下示例中的端口. ...