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 ...
随机推荐
- PostgreSQL学习笔记-1.基础知识:创建、删除数据库和表格
PostgreSQL 创建数据库 PostgreSQL 创建数据库可以用以下三种方式:1.使用 CREATE DATABASE SQL 语句来创建.2.使用 createdb 命令来创建.3.使用 p ...
- Python3中的printable
import string characters = string.printable # printable 是用作字符串常量的预初始化字符串.里面包含所有的标点符号,数字 print(charac ...
- salesforce零基础学习(一百三十三)ListView的button思考
本篇参考: salesforce零基础学习(九十五)lightning out salesforce零基础学习(一百一十)list button实现的一些有趣事情 https://help.sales ...
- FWT & FMT(位运算卷积)学习笔记
它们两个的全名叫 快速沃尔什变换(FWT) 和 快速莫比乌斯变换(FMT),用来在 \(O(n\log n)\) 时间复杂度内求位运算卷积. 因为 FMT 能解决的问题是 FWT 的子集,所以这里不讲 ...
- Vue 3 中用组合式函数和 Shared Worker 实现后台分片上传(带哈希计算)
01. 背景 最近项目需求里有个文件上传功能,而客户需求里的文件基本上是比较大的,基本上得有 1 GiB 以上的大小,而上传大文件尤其是读大文件,可能会造成卡 UI 或者说点不动的问题.而用后台的 W ...
- [vue]精宏技术部试用期学习笔记 I
精宏技术部试用期学习笔记(vue) 什么是vue? 我个人对 vue 的理解 是把 html\css\js 三件套融合起来的结构,同时用组件化的思维把一个页面装填起来 同时让页面形成树状结构 优点是方 ...
- eclipse安装velocity插件(转)
http://www.jspxcms.com/knowledge/46.html http://blog.csdn.net/superbeck/article/details/5721382 插件地址 ...
- 带您了解 O2OA 流程中的人工活动处理方式
这次咱们来介绍 O2OA (翱途) 开发平台流程引擎中的人工活动的处理方式和逻辑,O2OA (翱途) 主要采用拖拽可视化开发的方式完成流程的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操 ...
- JUC并发编程学习笔记(十七)彻底玩转单例模式
彻底玩转单例模式 单例中最重要的思想------->构造器私有! 恶汉式.懒汉式(DCL懒汉式!) 恶汉式 package single; //饿汉式单例(问题:因为一上来就把对象加载了,所以可 ...
- H.264 和 H.265对比
前言 H.264标准正式发布于2003年3月,距今已经20多年了,但它仍然是当下最流行的视频编解码标准. H.265正式发布于2013年4月.虽然H.265标准是围绕着H.264进行制定的,也保留了原 ...