您的位置:首页 > 运维架构

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

2013-08-08 09:40 375 查看
题目链接

测试dinic模版,不知道这个模版到底对不对,那个题用这份dinic就是过不了。加上优化就WA,不加优化TLE。

#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
#define INF 0x3ffffff
struct node
{
int u,v,next,re,w;
} edge[200001];
int first[501],dis[501];
int p[251][251];
int t;
int sv,ev,K,C,M;
void CL()
{
t = 1;
memset(first,-1,sizeof(first));
}
void add(int u,int v,int w)
{
edge[t].u = u;
edge[t].v = v;
edge[t].w = w;
edge[t].re = t+1;
edge[t].next = first[u];
first[u] = t++;
edge[t].u = v;
edge[t].v = u;
edge[t].w = 0;
edge[t].re = t-1;
edge[t].next = first[v];
first[v] = t ++;
}
int bfs()
{
int u,v,i;
memset(dis,0xff,sizeof(dis));
queue<int> que;
que.push(sv);
dis[sv] = 0;
while(!que.empty())
{
u = que.front();
que.pop();
for(i = first[u]; i != -1; i = edge[i].next)
{
v = edge[i].v;
if(edge[i].w > 0&&dis[v] < 0)
{
dis[v] = dis[u] + 1;
que.push(v);
}
}
}
if(dis[ev] > 0) return 1;
else return 0;
}
int dfs(int u,int step)
{
int i,a = 0,v,flag = 0;
if (u == ev) return step;
for (i = first[u];i != -1&&flag < step; i = edge[i].next)//flag<step
{
v = edge[i].v;
if (edge[i].w > 0&& dis[v] == dis[u]+1&&(a = dfs(v,min(step,edge[i].w))))
{
edge[i].w -= a;
flag += a;//这里
edge[edge[i].re].w += a;
return a;
}
}
if(flag == 0) dis[u] = -1;//这里
return flag;
}
void build(int x)
{
int i,j;
CL();
for(i = 1; i <= K; i ++)
{
add(0,i,M);
}
for(i = 1; i <= K; i ++)
{
for(j = 1; j <= C; j ++)
{
if(p[i][j+K] <= x)
add(i,K+j,1);
}
}
for(i = 1;i <= C;i ++)
{
add(i+K,ev,1);
}
}
int fun(int x)
{
int ans = 0,res;
build(x);
while(bfs())
{
while(res=dfs(sv,INF))
ans += res;
}
if(ans == C)
return 1;
else
return 0;
}
int bin(int l,int r)
{
int str,mid,end;
str = l;
end = r;
while(str < end)
{
mid = (str + end)/2;
if(fun(mid))
{
end = mid;
}
else
{
str = mid + 1;
}
}
return end;
}
int main()
{
int i,j,k;
while(scanf("%d%d%d",&K,&C,&M)!=EOF)
{
for(i = 1;i <= K+C;i ++)
{
for(j = 1;j <= K+C;j ++)
{
scanf("%d",&p[i][j]);
if(i != j&&p[i][j] == 0)
p[i][j] = INF;
}
}
for(i = 1;i <= K+C;i ++)
{
for(j = 1;j <= K+C;j ++)
{
for(k = 1;k <= K+C;k ++)
{
if(p[j][k] > p[j][i] + p[i][k])
p[j][k] = p[j][i] + p[i][k];
}
}
}
sv = 0;
ev = K+C+1;
int maxz = 0;
for(i = 1;i <= K+C;i ++)
{
for(j = 1;j <= K+C;j ++)
maxz = max(maxz,p[i][j]);
}
printf("%d\n",bin(0,maxz));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: