洛谷 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,对该国进行战略性措施,以解救涂炭的生灵 ...
随机推荐
- [转载]Mybatis Generator最完整配置详解
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...
- python对离散数据进行编码
机器学习中会遇到一些离散型数据,无法带入模型进行训练,所以要对其进行编码,常用的编码方式有两种: 1.特征不具备大小意义的直接独热编码(one-hot encoding) 2.特征有大小意义的采用映射 ...
- 详细介绍如何自研一款"博客搬家"功能
前言 现在的技术博客(社区)越来越多,比如:imooc.spring4All.csdn.cnblogs或者iteye等,有很多朋友可能在这些网站上都发表过博文,当有一天我们想自己搞一个博客网站时就会发 ...
- IDEA关联mysql失败Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon'
时区错误,MySQL默认的时区是UTC时区 要修改mysql的时长 在mysql的命令模式下,输入: set global time_zone='+8:00'; 再次连接成功
- API接口的安全设计验证—ticket,签名,时间戳
概述 与前端对接的API接口,如果被第三方抓包并进行恶意篡改参数,可能会导致数据泄露,甚至会被篡改数据,我主要围绕时间戳,token,签名三个部分来保证API接口的安全性 1.用户成功登陆站点后,服务 ...
- wdCP V3.2
wdCP是什么?关于wdCP更多的介绍,可看http://www.wdlinux.cn/wdcp/安装前先去体验下,看演示站吧http://www.wdlinux.cn/bbs/thread-5285 ...
- .NET Core 处理 WebAPI JSON 返回烦人的null为空
前言 项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段 ...
- Java实现RS485串口通信
前言 前段时间赶项目的过程中,遇到一个调用RS485串口通信的需求,赶完项目因为楼主处理私事,没来得及完成文章的更新,现在终于可以整理一下当时的demo,记录下来. 首先说一下大概需求:这个项目是机器 ...
- linux环境下oracle 11g 静默安装
安装环境 Linux服务器:oracle linux 6.6 64位 Oracle服务器:Oracle11gR2 64位 系统要求 1.Linux安装Oracle系统要求 系统要求 说明 内存 必须高 ...
- LeetCode141-环形链表检测
题目 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置 ...