标签:使用 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