码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-30 17:29:24      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:使用   os   io   for   问题   amp   size   ios   

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 --- 最大流,二分,布布扣,bubuko.com

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

标签:使用   os   io   for   问题   amp   size   ios   

原文地址:http://blog.csdn.net/u011032846/article/details/38302667

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!