题目链接

luogu P1401 城市

题解

二分最小边权,dinic检验

代码

// luogu-judger-enable-o2
/*
二分最小边权,dinic检验
*/
#include<queue>
#include<cctype>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9'){if(c == '-')f =- 1 , c = getchar(); }
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
return x * f;
}
#define INF 1e9 + 7
const int maxn = 40007;
struct node {
int u,v,w,next;
bool operator < (const node & a) const {
return w < a.w;
}
} e[maxn];
int head[maxn],num = 1;
struct Node {
int v,flow,next;
} edge[maxn << 2];
inline void add_edge(int u,int v,int flow ) {
edge[++ num].v = v;edge[num].next = head[u];head[u] = num; edge[num].flow = flow;
edge[++ num].v = u;edge[num].next = head[v];head[v] = num; edge[num].flow = flow;
}
int cur[maxn];
int S = 1,T ;
int n,m,t;
std::queue<int>q;
int lev[maxn];
bool bfs() {
for(int i = 0;i <= n;++ i) cur[i] = head[i];
for(int i = 0;i <= n;++ i) lev[i] = -1;
q.push(S),lev[S] = 0;
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = head[u];i;i = edge[i].next)
if(edge[i].flow > 0 && lev[edge[i].v] == -1) lev[edge[i].v] = lev[u] + 1,q.push(edge[i].v);
}
return lev[T] != -1;
}
int dfs(int now,int flow) {
if(now == T) return flow;
int rest = 0 , delta;
for(int &i = cur[now];i;i = edge[i].next) {
int v = edge[i].v;
if(lev[v] != lev[now] + 1 || edge[i].flow <= 0) continue;
delta = dfs(v,std::min(flow - rest,edge[i].flow));
if(delta) {
edge[i].flow -= delta;
edge[i ^ 1].flow += delta;
rest += delta; if(rest == flow) break;
}
}
if(rest == flow) lev[now] = -1;
return rest;
}
int dinic() {
int ret = 0;
while(bfs()) ret += dfs(S,INF);
return ret;
}
bool check(int x) {
num = 1;
memset(head,0,sizeof head);
for(int i = 1;i <= m;++ i)
if(e[i].w <= x) add_edge(e[i].u,e[i].v,1);
else break;
return dinic() >= t;
}
int main() {
n = read(),m = read(),t = read(); T = n;
for(int i = 1;i <= m;++ i) e[i].u = read(), e[i].v = read(),e[i].w = read();
std::sort(e + 1, e + m + 1);
int l = 0,r = 100000007;
int ans = -1;
while(l <= r) {
int mid = l + r >> 1;
if(check(mid)) ans = mid , r = mid - 1;
else l = mid + 1;
}
printf("%d\n",ans);
return 0;
}

luogu P1401 城市的更多相关文章

  1. Luogu P1401 城市(二分+网络流)

    P1401 城市 题意 题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最 ...

  2. luogu P4842 城市旅行

    嘟嘟嘟 好题,好题 刚开始突发奇想写了一个\(O(n ^ 2)\)暴力,结果竟然过了?!后来才知道是上传题的人把单个数据点开成了10s-- 不过不得不说我这暴力写的挺好看的.删边模仿链表删边,加边的时 ...

  3. 洛谷 P1401 城市(二分+网络流)

    题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...

  4. [洛谷P1401]城市

    题目大意:有$n(2\leqslant n\leqslant200)$个城市,$m(1\leqslant m\leqslant40000)$条无向边,你要找$T(1\leqslant T\leqsla ...

  5. P1401 城市(30分,正解网络流)

    题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...

  6. luogu P1453 城市环路

    题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...

  7. LUOGU P1453 城市环路(基环树+dp)

    传送门 解题思路 一道基环树上$dp$的题,这种题比较套路吧,首先第一遍$dfs$把环找出来,然后对于环上的每一个点都向它子树内做一次树形$dp$,$f[i][0/1]$表示到了$i$这个点选或不选的 ...

  8. 洛谷 P1401 城市

    写在前面 今天来水主题库里的有水分的紫题,随便一翻竟然找到宝了. 小清新二分 + 网络流. 算法思路 考虑到题目中限制的是最大边权,要求最大边权最小,那么很容易想到二分答案. 单调性的证明:最大边权是 ...

  9. AC日记——城市 洛谷 P1401

    题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...

随机推荐

  1. 压力测试以及编译安装httpd2.4

    压力测试以及编译安装httpd2.4 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用 deflate_module模块压缩页面优化传输速度 我们的httpd软件自带的有一个 ...

  2. CCNA学习与实验指南——第3章 以太网

    以太网就是局域网,IEEE制定了802.2和802.3两种标准.802.2规定了OSI模型的数据链路层的上半部分(LLC子层),802.3规定了OSI模型的数据链路层的下半部分和物理层(MAC子层). ...

  3. JAVA-Servlet内容

    Servlet重定向 HttpServletResponse接口的sendRedirect()方法可以用于将响应重定向到另一个资源,资源可能是servlet,jsp或html文件. 它接受相对和绝对U ...

  4. Solr记录-solr检索和查询数据

    Solr检索数据 在本章中,我们将讨论如何使用Java Client API检索数据.假设有一个名为sample.csv的.csv文档,其中包含以下内容. 001,9848022337,Hyderab ...

  5. Spring 学习02

    一.上节内容回顾 1 spring的概念 (1)核心:ioc和aop (2)spring一站式框架 2 spring的bean管理(xml) (1)bean实例化 (2)注入属性 (3)注入对象属性 ...

  6. OnContextMenu事件(转)

    用oncontextmenu事件单禁用右键菜单 一个页面中,BODY中用oncontextmenu='return false'来取消鼠标右键:在JS中设置oncontextmenu='return ...

  7. 强悍的CSS工具组合:Blueprint, Sass, Compass

    掌握CSS是每个Web开发者的基本要求,虽然CSS本身并不复杂,但怎样写出支持所有主流浏览器(特别是IE)的CSS,以及在大型网站中如何有序地组织好CSS结构却是一个相当棘手的问题.我更多的是一个开发 ...

  8. 20155320 2016-2017-2《Java程序设计》第八周学习总结

    20155320 2016-2017-2<Java程序设计>第八周学习总结 教材学习内容总结 NIO与NIO2 Channel继承框架 想要取得Channel的操作对象,可以使用Chann ...

  9. mybatis查询缓存——(十三)

    1.     mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存.

  10. Shell中各种判断语法

    Shell判断 按照文件类型进行判断 -b 判断文件是否存在,并且是否为快设备文件(是块设备文件为真) -c 判断文件是否存在,并且是否为字符设备文件(是字符设备文件为真) -d 判断文件是否存在,并 ...