POJ 2112 Optimal Milking(最大流+二分)
2013-08-08 09:40
375 查看
题目链接
测试dinic模版,不知道这个模版到底对不对,那个题用这份dinic就是过不了。加上优化就WA,不加优化TLE。
测试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; }
相关文章推荐
- 【最大流+最短路+二分】POJ-2112 Optimal Milking
- POJ_2112_Optimal Milking(最大流+二分)
- POJ 2112 Optimal Milking (二分 + 最大流)
- poj 2112 Optimal Milking 【最大流 简单题】 【floyd预处理最短路 + 二分 + 最大流】
- POJ 2112 Optimal Milking(Floyd + 二分 + 最大流)
- POJ 2112 Optimal Milking(最大流-Dinic+Floyd+二分)
- POJ-2112 Optimal Milking 二分+最大流或二分图匹配
- poj 2112 (最大流+二分)
- POJ 2112 Optimal Milking 二分+二分图多重匹配,网络最大流
- poj 2112 Optimal Milking(二分+最大流)
- Poj 2112 Optimal Milking【Floyd+二分+最大流Dinic】
- POJ 2112 —— Optimal Milking 二分+Floyd+最大流
- POJ 2112 Optimal Milking 二分答案+最大流
- poj 2112 Optimal Milking(spfa+二分+最大流)
- POJ_2112_Optimal Milking( 二分查找 + Floyd + 最大流EK )
- POJ 2112 Optimal Milking 二分+最大流
- POJ 2112 Optimal Milking (二分+最短路+最大流or二分图多重匹配)
- POJ 2112 Optimal Milking(最大流+Floyd+二分||二分图匹配)
- poj 2112 Optimal Milking(最大费用流+dinic算法+二分搜索)
- HLG 1392 (POJ 2112 Optimal Milking)【二分+二分图多重匹配 + 最大流】