poj2112 Optimal Milking --- 最大流,二分

nx个挤奶器,ny头奶牛,每个挤奶器最多能供m头奶牛使用。

现给出nx+ny之间的距离矩阵,求使得全部奶牛都到某个挤奶器挤奶所走的路程中,单个奶牛所走的最大路程的最小值。

开始感觉这个类似二分图匹配,不同之处在于挤奶器可以连接m个以内的奶牛,用网络流的模型是可以求出满足条件的解的。

问题是如何满足最大路程的最小值,这一种典型的二分的问法。。

所以我们二分答案,也就是枚举最大路程,直到求得最小值。

每次建边既添加所有最大路程以内的边,添加源点向每个挤奶器建边,容量为m,其他边都是1,

若返回的最大流是ny则该枚举值可以达到。

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define eps 1e-6
#define ll __int64
const int maxn=300;
using namespace std;

int n,s,t,level[maxn],c[maxn][maxn];
int m,nx,ny,dis[maxn][maxn];

bool makelevel()
{
    memset(level,0,sizeof level);
    level[s]=1;
    int q[maxn];
    int fro=0,iq=0;
    q[iq++]=s;
    int i,v;
    while(fro!=iq)
    {
        v=q[fro++];
        for(i=0;i<=n+1;i++)
        {
            if(!level[i]&&c[v][i])
            {
                level[i]=level[v]+1;
                q[iq++]=i;
            }
        }
    }
    if(!level[t]) return 0;
    return 1;
}

int dfs(int now,int maxf)
{
    if(now==t) return maxf;
    int ret=0;
    for(int i=0;maxf&&i<=n+1;i++)
    {
        if(c[now][i]&&level[now]+1==level[i])
        {
            int tmp=dfs(i,min(maxf,c[now][i]));
            c[now][i]-=tmp;
            c[i][now]+=tmp;
            ret+=tmp;
            maxf-=tmp;
        }
    }
    return ret;
}

int dinic(int d)
{
    int i,j;
    memset(c,0,sizeof c);
    for(i=1;i<=nx;i++)
    {
        c[s][i]=m;
        for(j=nx+1;j<=n;j++)
        {
            c[j][t]=1;
            if(dis[i][j]<=d) c[i][j]=1;
        }
    }
    int ans=0;
    while(makelevel()) ans+=dfs(s,inf);
    return ans;
}

poj2112 Optimal Milking --- 最大流,二分

时间: 2024-10-11 23:15:53

poj2112 Optimal Milking --- 最大流,二分的相关文章

POJ-2112 Optimal Milking(最大流)未完待续~

1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <queue> 6 #include <stack> 7 #include <vector> 8 #include <iostream> 9 #include "algorithm" 10 #define me

POJ2112 Optimal Milking 二分法+网络流

题目大意是:K台挤奶机器,C头牛,K不超过30,C不超过200,每台挤奶机器最多可以为M台牛工作,给出这些牛和机器之间,牛和牛之间,机器与机器之间的距离,在保证让最多的牛都有机器挤奶的情况下,给出其中最长的一头牛移动的距离的最小值. 首先用Floyd求出任意两点之间的最短距离,然后再用二分法限定最多的移动距离d,在求最大流时,搜索增广路的时候同时也判断距离有没有超过d就行了. #include <stdlib.h> #include <stdio.h> #include <v

POJ2112 Optimal Milking 【最大流+二分】

Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12482   Accepted: 4508 Case Time Limit: 1000MS Description FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among the C (1 <= C <= 200) co

POJ-2112 Optimal Milking(floyd+最大流+二分)

题目大意: 有k个挤奶器,在牧场里有c头奶牛,每个挤奶器可以满足m个奶牛,奶牛和挤奶器都可以看成是实体,现在给出两个实体之间的距离,如果没有路径相连,则为0,现在问你在所有方案里面,这c头奶牛需要走的最大距离的最小值. 分析: 先将题目给出来的距离矩阵跑一下 Floyd 求出全源最短路方便后面建图, 这里注意一下除了对角线的点若有其他点为 0 则应将其值设置为 INF 代表不可达 在使用最大流判断是否存在解的时候,要对每个解都重新建图. 建图需要一个超级源点,把所有的奶牛与源点相连,容量设置为1

POJ2112 Optimal Milking(最大流)

先Floyd求牛到机器最短距离,然后二分枚举最长的边. 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF (1<<30) 7 #define MAXN 233 8 #define MAXM 233*233*20 9 10 struct Edge{ 11 int v,c

poj 2112 Optimal Milking 最大流

http://poj.org/problem?id=2112 [题意]  k个机器,每个机器最多服务m头牛.c头牛,每个牛需要1台机器来服务.给出一个矩阵表示每两个实体之间的直接距离.(注意两个实体没有直接 距离的时候用0表示) 问:让所有的牛都被服务的情况下,使走的最远的牛的距离最短,求这个距离. [思路]  先用floyd求出每两个实体间的最短距离,再二分所求的距离len. [建图] 源点向每个机器连边,容量为m.每个机器向距离小于len的牛连边,容量为1.每头牛向汇点连边,容量为1.若最大

(二分最大流) 最大流 + 二分查找 小结

做最大流题目的时候会遇到一种需要用二分查找的题型: (poj2455) 一张无向图中有 N 个点,M 条边,每条边都有一个权值,且每条边只能用一次,要求找出 T 条从 1 到 N 的路径,使这 T 条路径所经过的边中,权值的最大值最小. 转化为最大流模型:T就是最大流,每条边只能用一次在网络流中就是容量为1.然后二分查找(枚举),边权小于或等于mid的边就加一条容量为1的网络流的边.最后知道最大流ans与T相等的最小的mid就是所求. 在二分查找的时候,与一般的二分查找还是有区别的,一般不能有“

POJ 2112 Optimal Milking(二分+最大流)

POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每个机器能容纳m个奶牛,问所有奶牛都能挤上奶,那么走的距离最大的奶牛的最小值是多少 思路:明显的二分+最大流,注意floyd求出的距离矩阵最大值可能不止200,所以二分的上限要注意 代码: #include <cstdio> #include <cstring> #include <queue> #include <algori

POJ 2112 Optimal Milking 最优挤奶方案 Floyd算法+二分查找+最大流

题目链接:POJ 2112 Optimal Milking Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12446   Accepted: 4494 Case Time Limit: 1000MS Description FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among