博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2112 二分+floyd+多源多汇最大流
阅读量:7119 次
发布时间:2019-06-28

本文共 2785 字,大约阅读时间需要 9 分钟。

/*此题不错,大致题意:c头牛去k个机器处喝奶,每个喝奶处最多容纳M头牛,求所有牛中走的最长路的
那头牛,使该最长路最小。思路:最大最小问题,第一灵感:二分答案check之。对于使最长路最短,
用folyd算出所有牛到每个喝奶点的最短路,每次枚举最大值,取不大于该值的路,重新构图;把所有牛赶去
喝奶点,在喝奶点有限制,不是多源多汇吗?!取超级源点,限制为1(一头牛),超级汇点,限制为
m,即可。其他路限制随意。
关键点:分清哪些是流量,最短路只是构图的一个方式(条件)。此题注意编号(原图1--k是目标,后面是

牛(起点)。)

#include
//140ms, 1A#include
#include
#include
using namespace std;int k,c,m;const int inf =0x3f3f3f3f;int a[250][250]; int minmax;int e[20000][3];int head[250]; //链式前向星二维数组表示法,0:to,1:pre,2:wight;void folyd() //最短路不用说{ for(int i=1;i<=k+c;i++) for(int j=1;j<=k+c;j++) for(int ii=1;ii<=k+c;ii++) { if(a[j][ii]>a[j][i]+a[i][ii]) { a[j][ii]=a[j][i]+a[i][ii]; if(a[j][ii]>minmax)minmax=a[j][ii]; //枚举上界 } }}void build(int limit) //由限制,选小于之的路,重新构图{ for(int i=0;i<=k+c+2;i++) head[i]=-1; int num=0; for(int i=c+1;i<=c+k;i++) //超级汇点 { e[num][0]=c+k+1;e[num][1]=head[i];head[i]=num; e[num++][2]=m; e[num][0]=i;e[num][1]=head[c+k+1];head[c+k+1]=num; e[num++][2]=0; } for(int i=1;i<=c;i++) //超级源点 { e[num][0]=0;e[num][1]=head[i];head[i]=num; e[num++][2]=0; e[num][0]=i;e[num][1]=head[0];head[0]=num; e[num++][2]=1; } for(int i=1;i<=k;i++) //其他点 for(int j=k+1;j<=k+c;j++) if(a[i][j]<=limit) { e[num][0]=j-k;e[num][1]=head[i+c];head[i+c]=num; e[num++][2]=0; e[num][0]=i+c;e[num][1]=head[j-k];head[j-k]=num; e[num++][2]=1; }}int level[250];int vis[250];bool bfs() //bfs+dfs,dinic算法{ for(int i=0;i<=k+c+1;i++) vis[i]=level[i]=0; queue
q; q.push(0);vis[0]=1; while(!q.empty()) { int cur=q.front();q.pop(); for(int i=head[cur];i!=-1;i=e[i][1]) { int to=e[i][0]; if(!vis[to]&&e[i][2]>0) { vis[to]=1; level[to]=level[cur]+1; if(to==k+c+1)return 1; q.push(to); } } } return vis[k+c+1];}int dfs(int uu,int minf) { if(uu==k+c+1||minf==0)return minf; int sum=0,f; for(int i=head[uu];i!=-1&&minf;i=e[i][1]) { int to=e[i][0]; if(level[to]==level[uu]+1&&e[i][2]>0) { f=dfs(to,minf
left+1) //二分答案,注意一下 { mid=(right+left)/2; if(check(mid)) { right=mid; } else left=mid; } if(check(right-1)) //最后二分时判断特殊情况 printf("%d\n",right-1); else printf("%d\n",right);}

转载于:https://www.cnblogs.com/yezekun/p/3925745.html

你可能感兴趣的文章
zip压缩工具与tar打包并压缩工具
查看>>
我的友情链接
查看>>
(8)Xwork容器概览
查看>>
gem包 用途说明
查看>>
C# textBox框实现输入像百度搜索出现下拉列表的格式
查看>>
混日子不是你的错,根源在这里
查看>>
WEB 自动化测试工具 Selenium 简介及其应用
查看>>
揭密银行系统开发
查看>>
phpstudy apache设置伪静态
查看>>
鼠标悬浮标签显示提示内容
查看>>
使用Cobbler安装多版本操作系统
查看>>
HAProxy负载均衡代理
查看>>
crontab 计划任务
查看>>
db2审计功能db2audit导致的数据库宕机问题处理
查看>>
TSM介绍
查看>>
链表的基本操作
查看>>
如何优雅的处理异常(java)
查看>>
ElasticSearch遇到问题
查看>>
php后台登陆页面代码
查看>>
Java中类的初始化顺序是什么?
查看>>