原题链接

题意

  • 给出一个简单无向图,边权全部为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. Ubuntu更新软件的命令

    更新软件源 apt-get update 更新升级所有软件 apt-get upgrade 更新某个软件 apt-get upgrade 名 列出可更新的软件 apt list --upgradabl ...

  2. Pricing

    Skip to main content Site Navigation Research Product Developers Safety Company Search   Pricing Sim ...

  3. MySQL PXC 集群运维指南

    目录 一.PXC方案概述 二.PXC基础知识 三.PXC节点的配置安装 四.PXC节点的上线与下线 五.其他 一.PXC方案概述 Percona XtraDB Cluster (PXC) 是一个完全开 ...

  4. [SWPUCTF 2021 新生赛]sql

    看到网站上写着参数是wllm,就用wllm=1试了一下,发现是SQL注入 查找字段数时,提示请勿非法操作 说明空格出现过滤,可以用/**/绕过 http://1.14.71.254:28347/?wl ...

  5. [ABC212E] Safety Journey 题解

    Safety Journey 题目大意 给定一张缺少了 \(m\) 条边的 \(n\) 个点的完全图和一个正整数 \(k\),你需要求出满足以下条件的序列 \(A\) 的数量: \(A\) 的长度为 ...

  6. 浅谈Python异步编程

    1. 异步编程概述 异步编程是一种编程范式,用于处理那些需要等待I/O操作完成或者耗时任务的情况.在传统的同步编程中,代码会按照顺序逐行执行,直到遇到一个耗时操作,它会阻塞程序的执行直到操作完成.这种 ...

  7. tomcat环境

    tomcat环境部署时需要先部署JDK工具: JDK环境: #将上传的jdk包进行解压/并移至Java目录下: tar xf jdk1.8.0_131.tar.gz mkdir -p /usr/jav ...

  8. 全局关闭Unity编译的CS警告

    实现方式 Editor和Game的全局CSharp编译配置文件名: Assets/mcs.rsp 添加如下内容可屏蔽对应的警告信息 -nowarn:1234 常用内容 CS0219 未使用的publi ...

  9. 基于springboot+vue开发的教师工作量管理系

    教师工作量管理系 springboot31 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟.本文介绍了教师工作量管理系统的开发全过程.通过分析教师工作量管理系统 ...

  10. OpenGL 基础光照详解

    1. 光照 显示世界中,光照环境往往是相对复杂的.因为假设太阳作为世界的唯一光源,那么太阳光照在物体A上A将阳光进行反射后,A又做为一个新的光源共同作用于另一个物体B.所以于B来讲光源是复杂的.然而这 ...