poj 2455 Secret Milking Machine 二分+最大流 sap
题目:p条路,连接n个节点,现在需要从节点1到节点n,不重复走过一条路且走t次,最小化这t次中连接两个节点最长的那条路的值。
分析:二分答案,对于<=二分的值的边建边,跑一次最大流即可。
- #include <set>
- #include <map>
- #include <list>
- #include <cmath>
- #include <queue>
- #include <stack>
- #include <string>
- #include <vector>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- #define debug puts("here")
- #define rep(i,n) for(int i=0;i<n;i++)
- #define rep1(i,n) for(int i=1;i<=n;i++)
- #define REP(i,a,b) for(int i=a;i<=b;i++)
- #define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
- #define pb push_back
- #define RD(n) scanf("%d",&n)
- #define RD2(x,y) scanf("%d%d",&x,&y)
- #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
- #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
- #define All(vec) vec.begin(),vec.end()
- #define MP make_pair
- #define PII pair<int,int>
- #define PQ priority_queue
- #define cmax(x,y) x = max(x,y)
- #define cmin(x,y) x = min(x,y)
- #define Clear(x) memset(x,0,sizeof(x))
- /*
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- int size = 256 << 20; // 256MB
- char *p = (char*)malloc(size) + size;
- __asm__("movl %0, %%esp\n" :: "r"(p) );
- */
- /******** program ********************/
- const int MAXN = 1005;
- const int MAXM = 100005;
- const int INF = 1e9;
- int po[MAXN],tol;
- int gap[MAXN],dis[MAXN],arc[MAXN],pre[MAXN],cur[MAXN];
- int n,m,vs,vt,t;
- struct Edge{
- int y,f,next;
- }edge[MAXM];
- struct node{
- int x,y,l;
- }p[MAXM];
- void Add(int x,int y,int f){
- edge[++tol].y = y;
- edge[tol].f = f;
- edge[tol].next = po[x];
- po[x] = tol;
- }
- void add(int x,int y,int f){
- Add(x,y,f);
- Add(y,x,f); // 正边、反边流量均为f
- }
- int sap(){
- memset(dis,0,sizeof(dis));
- memset(gap,0,sizeof(gap));
- gap[0] = vt;
- rep1(i,vt)
- arc[i] = po[i];
- int ans = 0;
- int aug = INF;
- int x = vs;
- while(dis[vs]<vt){
- bool ok = false;
- cur[x] = aug;
- for(int i=arc[x];i;i=edge[i].next){
- int y = edge[i].y;
- if(edge[i].f>0&&dis[y]+1==dis[x]){
- ok = true;
- pre[y] = arc[x] = i;
- aug = min(aug,edge[i].f);
- x = y;
- if(x==vt){
- ans += aug;
- while(x!=vs){
- edge[pre[x]].f -= aug;
- edge[pre[x]^1].f += aug;
- x = edge[pre[x]^1].y;
- }
- aug = INF;
- }
- break;
- }
- }
- if(ok)
- continue;
- int MIN = vt-1;
- for(int i=po[x];i;i=edge[i].next)
- if(edge[i].f>0&&dis[edge[i].y]<MIN){
- MIN = dis[edge[i].y];
- arc[x] = i;
- }
- if(--gap[dis[x]]==0)
- break;
- dis[x] = ++ MIN;
- ++ gap[dis[x]];
- if(x!=vs){
- x = edge[pre[x]^1].y;
- aug = cur[x];
- }
- }
- return ans;
- }
- inline bool ok(int mid){
- Clear(po);
- tol = 1;
- vs = 1;
- vt = n;
- rep1(i,m)
- if(p[i].l<=mid)
- add(p[i].x,p[i].y,1); // 此处是无向边
- return sap()>=t;
- }
- int main(){
- #ifndef ONLINE_JUDGE
- freopen("sum.in","r",stdin);
- //freopen("sum.out","w",stdout);
- #endif
- while(~RD3(n,m,t)){
- int l = 10000000 , r = 0;
- rep1(i,m){
- RD3(p[i].x,p[i].y,p[i].l);
- cmin(l,p[i].l);
- cmax(r,p[i].l);
- }
- int ans = 0;
- while(l<=r){
- int mid = (l+r)>>1;
- if(ok(mid)){
- r = mid-1;
- ans = mid;
- }else
- l = mid+1;
- }
- cout<<ans<<endl;
- }
- return 0;
- }
poj 2455 Secret Milking Machine 二分+最大流 sap的更多相关文章
- POJ 2455 Secret Milking Machine (二分 + 最大流)
题目大意: 给出一张无向图,找出T条从1..N的路径,互不重复,求走过的所有边中的最大值最小是多少. 算法讨论: 首先最大值最小就提醒我们用二分,每次二分一个最大值,然后重新构图,把那些边权符合要求的 ...
- POJ 2455 Secret Milking Machine(最大流+二分)
Description Farmer John is constructing a new milking machine and wishes to keep it secret as long a ...
- POJ 2455 Secret Milking Machine (二分+无向图最大流)
[题意]n个点的一个无向图,在保证存在T条从1到n的不重复路径(任意一条边都不能重复)的前提下,要使得这t条路上经过的最长路径最短. 之所以把"经过的最长路径最短"划个重点是因为前 ...
- POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9658 Accepted: ...
- POJ 2455 Secret Milking Machine 【二分】+【最大流】
<题目链接> 题目大意: FJ有N块地,这些地之间有P条双向路,每条路的都有固定的长度l.现在要你找出从第1块地到第n块地的T条不同路径,每条路径上的路段不能与先前的路径重复,问这些路径中 ...
- POJ 2455 - Secret Milking Machine
原题地址:http://poj.org/problem?id=2455 题目大意:给出一个N个点的无向图,中间有P条边,要求找出从1到n的T条通路,满足它们之间没有公共边,并使得这些通路中经过的最长的 ...
- POJ 2112 Optimal Milking(二分+最大流)
http://poj.org/problem?id=2112 题意: 现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大 ...
- POJ - 2112 Optimal Milking (dijkstra + 二分 + 最大流Dinic)
(点击此处查看原题) 题目分析 题意:在一个农场中有k台挤奶器和c只奶牛,每个挤奶器最多只能为m只奶牛挤奶,每个挤奶器和奶牛都视为一个点,将编号1~k记为挤奶器的位置,编号k+1~k+c记为奶牛的位置 ...
- POJ 2112 Optimal Milking (Floyd+二分+最大流)
[题意]有K台挤奶机,C头奶牛,在奶牛和机器间有一组长度不同的路,每台机器每天最多能为M头奶牛挤奶.现在要寻找一个方案,安排每头奶牛到某台机器挤奶,使得C头奶牛中走过的路径长度的和的最大值最小. 挺好 ...
随机推荐
- ios transition translate 闪屏问题总结
webkit在绘制页面时会将结构分为各种层,当层足够大时就会变成很大的平铺层.这样一来webkit在每次页面结构发生变化时不需要都渲染整个页面而是渲染对应层了,这对渲染速度来说相当的重要.webkit ...
- erlang: Programming Rules and Conventions。
http://www.erlang.se/doc/programming_rules.shtml#HDR33 http://www.erlang.org/eeps/eep-0008.html
- 网络虚拟化技术 TUN/TAP MACVLAN MACVTAP
TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设备是如何工作的:
- 非常好的在网页中显示pdf的方法
今天有一需求,要在网页中显示pdf,于是立马开始搜索解决方案,无意中发现一个非常好的解决方法,详见http://blogs.adobe.com/pdfdevjunkie/web_designers_g ...
- 为什么SSL证书流量暴增?
网络服务提供商 Sandvine 近日发布了一份报告,中提到了一个非常有趣的现象:和去年的数据相比,加密网络流量(SSL)在今年正在呈现出爆发式增长. 这个变化在欧洲表现得十分明显:和去年的 1.47 ...
- 用java发送邮件(黄海已测试通过)
/** * java发送带附件的邮件 * 周枫 * 2013.8.10 */ package com.dsideal.Util; import javax.mail.*; import javax.m ...
- C#中使用SQLite数据库简介(上)
[SQLite数据库] SQLite是一个开源的轻量级的桌面型数据库,它将几乎所有数据库要素(包括定义.表.索引和数据本身)都保存在一个单一的文件中.SQLite用C编写实现,它在内存消耗.文件体积. ...
- C#操作Word (2)-- 打开&关闭Word文档
本文正式开始在VS2010中使用C#语言操作Word2007. 不是十分了解Word对象模型的朋友,请参考上一篇文章,或者下载:C#操作Word2007.pdf. ------------------ ...
- SSI框架中配置log4j
事实上主要是log4j配置,跟SSI关系不大. web.xml中加入 <context-param> <param-name>log4jConfigLocation</p ...
- ORA-01489: result of string concatenation is too long
ORA-01489: result of string concatenation is too long Cause: String concatenation result is more tha ...