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 城市的更多相关文章
- Luogu P1401 城市(二分+网络流)
		
P1401 城市 题意 题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最 ...
 - luogu P4842 城市旅行
		
嘟嘟嘟 好题,好题 刚开始突发奇想写了一个\(O(n ^ 2)\)暴力,结果竟然过了?!后来才知道是上传题的人把单个数据点开成了10s-- 不过不得不说我这暴力写的挺好看的.删边模仿链表删边,加边的时 ...
 - 洛谷 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 ...
 - P1401 城市(30分,正解网络流)
		
题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...
 - luogu P1453 城市环路
		
题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...
 - LUOGU P1453 城市环路(基环树+dp)
		
传送门 解题思路 一道基环树上$dp$的题,这种题比较套路吧,首先第一遍$dfs$把环找出来,然后对于环上的每一个点都向它子树内做一次树形$dp$,$f[i][0/1]$表示到了$i$这个点选或不选的 ...
 - 洛谷 P1401 城市
		
写在前面 今天来水主题库里的有水分的紫题,随便一翻竟然找到宝了. 小清新二分 + 网络流. 算法思路 考虑到题目中限制的是最大边权,要求最大边权最小,那么很容易想到二分答案. 单调性的证明:最大边权是 ...
 - AC日记——城市 洛谷 P1401
		
题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...
 
随机推荐
- JavaScript基本数据类型介绍
			
JavaScript基本数据类型介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是javascript JavaScript一种直译式脚本语言,是一种动态类型.弱类型. ...
 - [整理]ASP.NET WEB API 2学习
			
目录 1 快速入门 1.1实例 1.1.1初识WEB API 2 1.1.2 Action Results 的改变 1.1.3 路由的新增特性 1.1.4 消息管道的变化 1.1.4.1 HttpMe ...
 - CSS3 定位| Position研究
			
视区(视口) 当浏览者查看一份网页文件时,通常使用者代理(User Agents, UA, 浏览器)会提供给浏览者一个视区(视窗或者是画面里的其它可视区域).当我们调整视区大小时,UA 就有可能会改变 ...
 - (A - 整数划分 HYSBZ - 1263)(数组模拟大数乘法)
			
题目链接:https://cn.vjudge.net/problem/HYSBZ-1263 题目大意:中文题目 具体思路:先进了能的拆成3,如果当前剩下的是4,就先不减去3,直接乘4,如果还剩2的话, ...
 - FFT(Rock Paper Scissors Gym - 101667H)
			
题目链接:https://vjudge.net/problem/Gym-101667H 题目大意:首先给你两个字符串,R代表石头,P代表布,S代表剪刀,第一个字符串代表第一个人每一次出的类型,第二个字 ...
 - Hibernate二级缓存(未完待续)
			
1.Hibernate的cache介绍: Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能.Hibernate中的Cache可分为两层 ...
 - BurpSuite中的安全测试插件推荐
			
Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息,持久性,认证,代 ...
 - 【黑客免杀攻防】读书笔记10 - switch-case分支
			
0x1 switch-case分支 switch-case其实就是if-else语句的另一种体现形式.但大于3之后的switchc-case.编译器会对代码进行优化. 1.1 简单switch-cas ...
 - C# UDP广播消息
			
首先是发送端: /// <summary> /// 发送UDP消息 /// </summary> /// <param name="msg">消 ...
 - Coursera台大机器学习技法课程笔记11-Gradient Boosted Decision Tree
			
将Adaboost和decision tree相结合,需要注意的地主是,训练时adaboost需要改变资料的权重,如何将有权重的资 料和decision tree相结合呢?方法很类似于前面讲过的bag ...