原题链接

题意

  • 给出一个简单无向图,边权全部为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时间复杂度的算法,那么首先我们要将二维枚举优化为一维。这里可以看到

\[d1[i] + d2[j] \le d1[j] + d2[i]
\]

可以化为

\[d1[i] - d2[i] \le d1[j] - d2[j]
\]
  • 那么我们可以按照这个变形后的式子来对点进行排序。然后可知,后面的点的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最短路 思维的更多相关文章

  1. World Tour CodeForces - 667D (bfs最短路)

    大意: 有向图, 求找4个不同的点ABCD, 使得d(A,B)+d(D,C)+d(C,A)最大

  2. POJ 2251 Dungeon Master (BFS最短路)

    三维空间里BFS最短路 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  3. 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路

    题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...

  4. 【bzoj1189】[HNOI2007]紧急疏散evacuate BFS最短路+动态加边网络流

    题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以 ...

  5. BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)

    BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...

  6. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  7. Codeforces 954D Fight Against Traffic(BFS 最短路)

    题目链接:Fight Against Traffic 题意:有n个点个m条双向边,现在给出两个点S和T并要增加一条边,问增加一条边且S和T之间距离不变短的情况有几种? 题解:首先dfs求一下S到其他点 ...

  8. [codeforces 1037D] Valid BFS? 解题报告(验证bfs序,思维题)

    题目链接:http://codeforces.com/problemset/problem/1037/D 题目大意: 给出一棵树,询问一个序列是否可能为这棵树从节点1开始遍历的bfs序 题解: 对于每 ...

  9. Codeforces 813C The Tag Game (BFS最短路)

    <题目链接> 题目大意:A.B两人在一颗树上,A在根节点1上,B在节点x上,现在他们轮流走,每次只能走一步,或者不走.A以尽可能靠近B的方式行走,B以尽可能远离A的方式走,B先开始走.问你 ...

  10. HDU2433 BFS最短路

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. wps 设置 word文档不可被修改,指定区域可以修改

    wps 设置 word文档不可被修改,指定区域可以修改 2021年03月03日09:38:10

  2. 《HelloGitHub》第 91 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  3. 针对Jupter Kernel error的问题解决

    首先打开Anaconda Prompt 输入jupyter kernelspec list查看安装的内核和位置 到显示的的目录下面找到 kernel.josn这个文件 修改为现在的python环境路径 ...

  4. 从A+B 到 sin A+cos B 再到 向量A+向量B

    从\(A+B\)到\(\sin A+\cos B\)再到\(\vec{A}+\vec{B}\) 目录 从\(A+B\)到\(\sin A+\cos B\)再到\(\vec{A}+\vec{B}\) 前 ...

  5. JavaScript:垃圾收集机制

    JavaScript具有自动垃圾收集机制.也就是说,执行环境会负责管理代码执行过程中使用的内存.开发人员不必关心内存分配和回收问题. 垃圾收集机制的原理:找到不再继续使用的变量,然后进行释放其占用的内 ...

  6. QGradient渐变填充

    QGradient渐变填充 QGradient (一)简介 (二)枚举类型 1.spread 2.CoordinateMode 3.type (三)常用函数 1.coordinateMode() 2. ...

  7. SMC

    记一次入门反调试技术 找到关键函数,先分析F5伪代码,发现了virtualprotect函数,联想到了SMC代码保护技术 但是到了后面分析发现分析不下去了,然后找了wp发现是代码反调试技术 然后细细看 ...

  8. 开发现代化的.NetCore控制台程序:(4)使用GithubAction自动构建以及发布nuget包

    前言 上一篇文章介绍了将 nuget 包发布到 Github Packages 上. 本文更进一步,使用 GitHub Action 搭建 CI/CD 流水线,进行 nuget 的自动构建和发布. G ...

  9. iOS APP包分析工具

    介绍 分享一款用于分析iOSipa包的脚本工具,使用此工具可以自动扫描发现可修复的包体积问题,同时可以生成包体积数据用于查看.这块工具我们团队内部已经使用很长一段时间,希望可以帮助到更多的开发同学更加 ...

  10. 配置postcss-pxtorem报:options has an unknown property 'plugins'

    闲聊: 小颖最近在坐大屏相关的项目,要写适配,之前用的:postcss-px2rem.px2rem-loader,和朋友闲聊呢他说他们也在写大屏,不过他们用的 postcss-pxtorem,在写另外 ...