题目大意:N个点P条边,令存在T条从1到N的路径,求路径上的边权的最大值最小为多少

思路:做了好多二分+最大流的题了,思路很好出 二分出最大边权后建图,跑dinic

问题是。。。。这题是卡常数的好题!!!!!

T了8发以后实在受不了,瞄了眼网上的程序,齐刷刷的邻接矩阵。。。。论邻接矩阵的优越性

但不信邪的我终于反复优化常数后邻接表A了

//TLE的程序

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <algorithm>

#include <queue>

#define maxn 200090

#define esp 0.001

#define inf 0x3f3f3f3f

using namespace std;

int head[300],next[maxn],point[maxn],now=0;

int flow[maxn],dist[300];

int tt,p,h=0,n;

struct T

{

int x;int y;int v;

}a[maxn];

void add(int x,int y,int v)

{

next[++now]=head[x];

head[x]=now;

point[now]=y;

flow[now]=v;

next[++now]=head[y];

head[y]=now;

point[now]=x;

flow[now]=0;

}

int bfs(int s,int t,int x)

{

queue<int>q;

q.push(s);

memset(dist,-1,sizeof(dist));

dist[s]=0;

while(!q.empty())

{

int u=q.front();

q.pop();

for(int i=head[u];i;i=next[i])

{

int k=point[i];

if(flow[i]!=0&&dist[k]==-1)

{

dist[k]=dist[u]+1;

q.push(k);

}

}

}

return dist[t]!=-1;

}

int dfs(int s,int d,int t,int x)

{

if(s==t)return d;

int res=0;

for(int i=head[s];i&&res<d;i=next[i])

{

int u=point[i];

if(flow[i]&&dist[u]==dist[s]+1)

{

int dd=dfs(u,min(flow[i],d-res),t,x);

if(dd)

{

flow[i]-=dd;

flow[((i-1)^1)+1]+=dd;

res+=dd;

}

}

}

if(res==0)dist[s]=-1;

return res;

}

int judge(int x,int s,int t)

{

int ans=0;

memset(head,0,sizeof(head));

now=0;

for(int i=1;i<=p;i++)if(a[i].v<=x)

{

add(a[i].x,a[i].y,1);

add(a[i].y,a[i].x,1);

}

add(s,1,tt);add(n,t,inf);

while(bfs(s,t,x))

{ans+=dfs(s,inf,t,x);}

if(ans>=tt)return 1;else return 0;

}

int read()

{

int x=0,f=1;char ch=getchar();

while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}

while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}

return x*f;

}

int main()

{

int x,y,v;

int l=0x3f3f3f3f,r=0,mid;

scanf("%d%d%d",&n,&p,&tt);

int s=n+10,t=n+12;

for(int i=1;i<=p;i++)

{

x=read();y=read();v=read();

a[i].x=x;a[i].y=y;a[i].v=v;

r=max(r,v);

l=min(l,v);

}

while(mid=(l+r)>>1,l<r)

{

if(judge(mid,s,t)==1)r=mid;else l=mid+1;

}

printf("%d\n",r);

return 0;

}

//AC的程序

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <algorithm>

#include <queue>

#define maxn 200090

#define esp 0.001

#define inf 0x3f3f3f3f

using namespace std;

int head[300],next[maxn],point[maxn],now=0;

int flow[maxn],dist[300];

int tt,p,h=0,n;

struct T

{

int x;int y;int v;

}a[maxn];

void add(int x,int y,int v)

{

next[++now]=head[x];

head[x]=now;

point[now]=y;

flow[now]=v;

next[++now]=head[y];

head[y]=now;

point[now]=x;

flow[now]=0;

}

int bfs(int s,int t,int x)

{

queue<int>q;

q.push(s);

memset(dist,-1,sizeof(dist));

dist[s]=0;

while(!q.empty())

{

int u=q.front();

q.pop();

for(int i=head[u];i;i=next[i])

{

int k=point[i];

if(flow[i]!=0&&dist[k]==-1)

{

dist[k]=dist[u]+1;

q.push(k);

}

}

}

return dist[t]!=-1;

}

int dfs(int s,int d,int t,int x)

{

if(s==t)return d;

int res=0;

for(int i=head[s];i&&res<d;i=next[i])

{

int u=point[i];

if(flow[i]&&dist[u]==dist[s]+1)

{

int dd=dfs(u,min(flow[i],d-res),t,x);

if(dd)

{

flow[i]-=dd;

flow[((i-1)^1)+1]+=dd;

res+=dd;

}

}

}

if(res==0)dist[s]=-1;

return res;

}

int judge(int x,int s,int t)

{

int ans=0;

memset(head,0,sizeof(head));

now=0;

for(int i=1;i<=p;i++)if(a[i].v<=x)

{

add(a[i].x,a[i].y,1);

add(a[i].y,a[i].x,1);

}

add(s,1,tt);add(n,t,inf);

while(bfs(s,t,x))

{ans+=dfs(s,inf,t,x);}

if(ans>=tt)return 1;else return 0;

}

int read()

{

int x=0,f=1;char ch=getchar();

while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}

while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}

return x*f;

}

int main()

{

int x,y,v;

int l=0x3f3f3f3f,r=0,mid;

scanf("%d%d%d",&n,&p,&tt);

int s=n+10,t=n+12;

for(int i=1;i<=p;i++)

{

x=read();y=read();v=read();

a[i].x=x;a[i].y=y;a[i].v=v;

r=max(r,v);

l=min(l,v);

}

while(mid=(l+r)>>1,l<r)

{

if(judge(mid,s,t)==1)r=mid;else l=mid+1;

}

printf("%d\n",r);

return 0;

}

做完也是醉了,不A不睡觉TUT

POJ2455 Secret Milking Machine【二分,最大流】的更多相关文章

  1. poj 2455 Secret Milking Machine 二分+最大流 sap

    题目:p条路,连接n个节点,现在需要从节点1到节点n,不重复走过一条路且走t次,最小化这t次中连接两个节点最长的那条路的值. 分析:二分答案,对于<=二分的值的边建边,跑一次最大流即可. #in ...

  2. POJ 2455 Secret Milking Machine (二分 + 最大流)

    题目大意: 给出一张无向图,找出T条从1..N的路径,互不重复,求走过的所有边中的最大值最小是多少. 算法讨论: 首先最大值最小就提醒我们用二分,每次二分一个最大值,然后重新构图,把那些边权符合要求的 ...

  3. POJ 2455 Secret Milking Machine(最大流+二分)

    Description Farmer John is constructing a new milking machine and wishes to keep it secret as long a ...

  4. POJ2455 Secret Milking Machine

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12324   Accepted ...

  5. POJ 2455 Secret Milking Machine (二分+无向图最大流)

    [题意]n个点的一个无向图,在保证存在T条从1到n的不重复路径(任意一条边都不能重复)的前提下,要使得这t条路上经过的最长路径最短. 之所以把"经过的最长路径最短"划个重点是因为前 ...

  6. poj2455Secret Milking Machine(二分+最大流)

    链接 二分距离,小于当前距离的边容量+1,使最后流>=t 注意 会有重边 #include <iostream> #include<cstdio> #include< ...

  7. 【bzoj1733】[Usaco2005 feb]Secret Milking Machine 神秘的挤奶机 二分+网络流最大流

    题目描述 Farmer John is constructing a new milking machine and wishes to keep it secret as long as possi ...

  8. POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9658   Accepted: ...

  9. BZOJ 1733: [Usaco2005 feb]Secret Milking Machine 神秘的挤奶机 网络流 + 二分答案

    Description Farmer John is constructing a new milking machine and wishes to keep it secret as long a ...

随机推荐

  1. 基于坐标的自动化测试神器---Total Control快速入门

    1.Total Control简单介绍 一款能够在PC上控制手机的软件,同时可以使用PC 触摸屏.鼠标.键盘, 全面操控 Android 手机,只需通过 USB 或 WiFi 连接手机至电脑,即可随时 ...

  2. [转].NET 4 并行(多核)编程系列之二 从Task开始

    本文转自:http://www.cnblogs.com/yanyangtian/archive/2010/05/22/1741379.html .NET 4 并行(多核)编程系列之二 从Task开始 ...

  3. Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理

    前言: 如果说J.U.C包下的核心是什么?那我想答案只有一个就是AQS.那么AQS是什么呢?接下来让我们一起揭开AQS的神秘面纱 AQS是什么? AQS是AbstractQueuedSynchroni ...

  4. new操作符具体干了什么

    function Func(){ }; var newFunc=new Func (); new共经过了4个阶段 1.创建一个空对象 var obj=new Object(); 2.设置原型链 把 o ...

  5. zipkin 服务追踪

    服务追踪,就是对请求接口的追踪并保存. 在测试的过程中我们会发现,有时候,程序刚刚启动后,刷新几次,并不能看到任何数据,原因就是我们的spring-cloud-sleuth收集信息是有一定的比率的,默 ...

  6. 如何在一次请求中通过JS中获取Url中的参数

    从A跳转到B,携带参数 例如: /pc/B.jsp?item=123456 B页面在js可以直接用 var item='${param.item}'; 这样就拿到啦 还有一种方法 定义一个函数   f ...

  7. 在移动端实现1px的边框

    由于分辨率 DPI 的差异,高清手机屏上的 1px 实际上是由 2×2 个像素点来渲染,有的屏幕甚至用到了 3×3 个像素点 所以 border: 1px 在移动端会渲染为 2px 的边框 与设计图产 ...

  8. Vickers Vane Pump - How To Choose Vane Pump Parameter Specifications?

    1 rated pressure selection. The rated pressure of the vane pump products is 7MPa, 1OMPa, 16MPa, 2lMP ...

  9. SVN 初级教程

    版本控制器:SVN 1.SVN 作用? 备份.代码还原.协同修改.多版本项目文件管理.追溯问题代码的编写人和编写时间.权限控制等. 2.版本控制简介 2.1 版本控制[Revision control ...

  10. 文本三剑客之grep

    接受正则表达式,按行匹配,将会过滤出匹配的所有行 格式: grep   [OPTION]...     PATTERN    [FILE]... 可以看出,grep后可以同时接多个文件 选项OPTIO ...