POJ2455 Secret Milking Machine【二分,最大流】
题目大意: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【二分,最大流】的更多相关文章
- poj 2455 Secret Milking Machine 二分+最大流 sap
题目:p条路,连接n个节点,现在需要从节点1到节点n,不重复走过一条路且走t次,最小化这t次中连接两个节点最长的那条路的值. 分析:二分答案,对于<=二分的值的边建边,跑一次最大流即可. #in ...
- 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 ...
- POJ2455 Secret Milking Machine
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12324 Accepted ...
- POJ 2455 Secret Milking Machine (二分+无向图最大流)
[题意]n个点的一个无向图,在保证存在T条从1到n的不重复路径(任意一条边都不能重复)的前提下,要使得这t条路上经过的最长路径最短. 之所以把"经过的最长路径最短"划个重点是因为前 ...
- poj2455Secret Milking Machine(二分+最大流)
链接 二分距离,小于当前距离的边容量+1,使最后流>=t 注意 会有重边 #include <iostream> #include<cstdio> #include< ...
- 【bzoj1733】[Usaco2005 feb]Secret Milking Machine 神秘的挤奶机 二分+网络流最大流
题目描述 Farmer John is constructing a new milking machine and wishes to keep it secret as long as possi ...
- POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9658 Accepted: ...
- 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 ...
随机推荐
- 基于CentOS6.5下snort+barnyard2+base的入侵检测系统的搭建(图文详解)(博主推荐)
为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机器环境实验室的大数 ...
- SpringBoot 2.x (5):异常处理与部署WAR项目
异常处理: SpringBoot的异常处理是不友好的,前端只会显示最基本的错误名称 后端控制台会报出具体的错误,那么我们如何告知前端具体的错误信息呢? 1:对全局异常进行处理 一个测试的Control ...
- PMP项目管理学习笔记(11)——范围管理之定义范围
定义范围过程组 定义范围包含将项目分解为团队成员要完成的具体工作之前你需要知道的所有一切. 输入:需求文档.项目章程.组织过程资产 工具:辅助工作室.产品分析.代理方案识别.专家判断 辅助工作室: 与 ...
- 在windows上安装Jenkins---tomcat流
在windows上安装Jenkins有两种方式: (1)jar流 在命令行中运行:java -jar jenkins.war 浏览器访问 localhost:8080,创建初始管理员帐号即可. (2) ...
- 如何在Ubuntu里安装Helm
Helm是什么?在战网上玩过暗黑破坏神2代的程序员们应该还记得,Helm是国度的意思. 而在计算机领域,Helm是什么? Helm是Kubernetes的一个包管理工具,有点像nodejs的npm,U ...
- 回顾Spring MVC_01_概述_入门案例
SpringMVC: SpringMVC是Spring为展现层提供的基于MVC设计的优秀的Web框架,是目前最主流的MVC框架之一 SpringMVC通过注解,让POJO成为处理请求的控制器,而无须实 ...
- 关于mybatis的一些用法
resultMap 的用法 <resultMap id="唯一标识" type="映射的pojo类"> <id column = " ...
- python数据类型常用内置函数之字符串
1.strip, lstrip, rstrip x = ' jiahuifeng ' print(x.strip(' ')) print(x.lstrip(' ')) print(x.rstrip(' ...
- executeFind(XXX) is undefined for the type hibernateTemplate(大概是这个错误吧)
两句话,jar包版本不一样,类中包含的方法可能有改变. 出错时用的是spring5.x版本,但是没有找到我的api.(不记得放在那里了),所以换了spring的版本(换成了spring3.x).问题解 ...
- git-忽略文件改动不进行提交
命令:git update-index --assume-unchanged 文件名 作用:忽略文件的改动,但是不加入.gitignore 文件中,这样可以达到仅在本地目录中忽略,不影响其他团队成员的 ...