洛谷 P1401 城市
写在前面
今天来水主题库里的有水分的紫题,随便一翻竟然找到宝了。
小清新二分 + 网络流。
算法思路
考虑到题目中限制的是最大边权,要求最大边权最小,那么很容易想到二分答案。
单调性的证明:最大边权是对可行的边的一个限制,因此这个值越大,对可行的边的限制放的就越宽,可供选择的边就不会变少。凑齐 \(t\) 条边的机会不会变小。满足单调性。
考虑到要找到 \(t\) 条可行路径,可以抽象成为在所有边权的容量都为 \(1\) 的情况下,最大流不小于 \(t\)。
求解最大流这里我使用的 dinic 算法。
dinic 算法的时间复杂度为 \(\mathcal O(n^2m)\),实际上远远跑不满,而且它有各种虽然不影响渐进时间复杂度,但是能够大大提高实际运行效率的优化和剪枝。因此实际运行效率极高。
Tips
- 注意存双向边、数组越界和每次清空。
Code
#include <bits/stdc++.h>
namespace Basic {
template <typename Temp> inline void read(Temp & res) {
Temp fh = 1; res = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') fh = -1;
for(; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ '0');
res = res * fh;
}
}
using namespace Basic;
using namespace std;
const int Maxn = 2e2 + 5;
const int Maxm = 8e4 + 5;
int n, m, t, x, y, z;
int l = 0, r = 0x7fffffff, mid, ans;
struct e {
int to, nxt, f;
} b[Maxm];
int head[Maxn], ecnt;
inline void add(int u, int v, int fl) {b[++ecnt] = (e) {v, head[u], fl}; head[u] = ecnt;}
struct edg {
int v_1, v_2, length;
} b0[Maxm];
queue<int> q;
int dep[Maxn], cur[Maxn];
bool bfs() {
memset(dep, 0, sizeof(dep));
while(!q.empty()) q.pop();
q.push(1); dep[1] = 1;
while(!q.empty()) {
int tnow = q.front(); q.pop();
for(register int i = head[tnow]; i; i = b[i].nxt) {
int tto = b[i].to, tf = b[i].f;
if((dep[tto]) || (!tf)) continue;
dep[tto] = dep[tnow] + 1;
q.push(tto);
if(tto == n) return true;
}
}
return false;
}
int dfs(int t, int flow) {
if(t == n) return flow;
int rest = flow;
for(; cur[t] && rest; cur[t] = b[cur[t]].nxt) {
int tto = b[cur[t]].to, tf = b[cur[t]].f;
if((dep[tto] != dep[t] + 1) || (!tf)) continue;
int res = dfs(tto, min(tf, rest));
rest -= res; b[cur[t]].f -= res; b[cur[t] ^ 1].f += res;
if(!res) dep[tto] = 0;
if(!rest) return flow;
}
return flow - rest;
}
bool check(int lim) {
int Maxflow = 0;
memset(head, 0, sizeof(head)); ecnt = 1;
for(register int i = 1; i <= m; ++i) {
if(b0[i].length <= lim) {
add(b0[i].v_1, b0[i].v_2, 1);
add(b0[i].v_2, b0[i].v_1, 1);
}
}
while(bfs()) {
memcpy(cur, head, sizeof(cur));
Maxflow += dfs(1, 0x7fffffff >> 1);
}
return Maxflow >= t;
}
int main() {
read(n); read(m); read(t);
for(register int i = 1; i <= m; ++i) {read(b0[i].v_1); read(b0[i].v_2); read(b0[i].length);}
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
printf("%d", ans);
return 0;
}
洛谷 P1401 城市的更多相关文章
- 洛谷 P1401 城市(二分+网络流)
题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...
- [洛谷P1401]城市
题目大意:有$n(2\leqslant n\leqslant200)$个城市,$m(1\leqslant m\leqslant40000)$条无向边,你要找$T(1\leqslant T\leqsla ...
- AC日记——城市 洛谷 P1401
题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...
- BSOJ3760||洛谷P1453 城市环路 题解
城市环路 Description 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环 ...
- 洛谷 P1453 城市环路 ( 基环树树形dp )
题目链接 题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域--城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市 ...
- [洛谷P3761] [TJOI2017]城市
洛谷题目链接:[TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速 ...
- 【经典DP】洛谷 P2782 友好城市
嘤嘤嘤,昨天两个文化课老师在上奥赛时招呼我(亲切交流),今天又要写工作报告,没时间写题解,希望今天能补上 友好城市 题目://洛谷那粘来的题面竟然能把格式粘过来 题目描述 有一条横贯东西的大河,河有笔 ...
- 洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)
洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到 ...
- 洛谷 P1656 炸铁路
P1656 炸铁路 题目提供者kkksc03 标签图论搜索/枚举洛谷原创 难度普及/提高- 题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵 ...
随机推荐
- 推荐使用并手写实现redux-actions原理
@ 目录 一.前言 二.介绍 2.1 创建action 2.2 reducer 2.3 触发action 三. 认识与手写createAction() 3.1 用法 3.2 原理实现 四.认识hand ...
- react状态管理器之mobx
react有几种状态管理器,今天先来整理一下mobx状态管理器,首先了解一下什么是mobx 1.mobx成员: observable action 可以干嘛: MobX 的理念是通过观察者模式对数据做 ...
- nginx二级域名配置[CentOS]
目录 背景 域名配置 服务器配置 Nginx配置 页面访问生效 背景 只有一台云服务器,部署了自己写的后端管理系统,又需要部署下自己的个人博客平台,但是只有一个域名,想要合理的利用下二级域名. 域名配 ...
- 【vue】常用指令
vue指令带有前缀 v-. 一.v-bind 单向数据绑定 在html中显示数据,除了使用插值表达式{{}}之外,也可以使用vue中的v-bind指令. ... ... <body> &l ...
- TIDB简介
摘自https://pingcap.com/docs-cn/ TiDB 是 PingCAP 公司设计的开源分布式 HTAP (Hybrid Transactional and Analytical P ...
- 安装cmake过程g++: 错误:unrecognized command line option ‘-std=gnu++14’
问题根因 这个错误一般是gcc/g++版本太低导致的 疑问 我本地明明安装的是高版本的gcc/g++为何说是低版本的呢,有图为证: 这主要是因为你安装了多个版本的gcc/g++,但是默认(/usr/b ...
- c#中io常用操作笔记
创建文件1 private void button1_Click(object sender, EventArgs e) { if (textBox1.Text == string.Empty) { ...
- mysql plugin
mysql plugin 概要 mysql可以通过启动参数,系统命令mysql_install,mysql命令install plugin来加载指定的插件 mysql的存储引擎被设计成插件式,可以根据 ...
- 使用Pr压缩视频,增大音量
视屏压缩(亲测有效教程):https://www.zhihu.com/question/67762625 音量增大(亲测有效教程):https://jingyan.baidu.com/article/ ...
- 【Java基础】多线程
多线程 基本概念 程序(program)是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process)是程序的一次执行过程,或是正在运行的一个程序.是一个动态 ...