zoukankan      html  css  js  c++  java
  • 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 mem(a,b) memset(a,b,sizeof(a))
    11 using namespace std;
    12 typedef long long LL;
    13 const int MAX=255;
    14 const int oo=100000005;
    15 int K,C,M,n;
    16 int st,en;
    17 int a[MAX][MAX],f[MAX][MAX],fa[MAX];
    18 void build(int mid){
    19     int i,j;
    20     mem(f,0);
    21     n=K+C;
    22     st=0,en=n+1;
    23     for (i=1;i<=K;i++)
    24         f[0][i]=1;
    25     for (i=K+1;i<=K+C;i++)
    26         f[i][en]=M;
    27     for (i=1;i<=K;i++)
    28         for (j=K+1;j<=K+C;j++)
    29             if (a[i][j]<=mid)
    30                 f[i][j]++;
    31 }
    32 bool bfs(){
    33     int i,j,k,u;
    34     mem(fa,-1);
    35     queue <int> q;
    36     q.push(st);
    37     fa[st]=0;
    38     while (!q.empty()){
    39         u=q.front();q.pop();
    40         for (i=0;i<=n+1;i++){
    41             if (fa[i]==-1 && f[u][i]!=0){
    42                 fa[i]=fa[u]+1;
    43                 q.push(i);
    44             }
    45         }
    46     }
    47     return fa[en]!=-1;
    48 }
    49 int dfs(int u,int curf){
    50     if (u==en) return curf;
    51     int dt=curf;
    52     for (int v=0;v<=n+1;v++){
    53         if (f[u][v]>0 && fa[v]==fa[u]+1){
    54             int flow=dfs(v,min(dt,f[u][v]));
    55             f[u][v]-=flow;
    56             f[v][u]+=flow;
    57             dt-=flow;
    58         }
    59     }
    60     return curf-dt;
    61 }
    62 int dinic(){
    63     int ans(0),curf;
    64     while (bfs())
    65         while (curf=dfs(st,oo))
    66             ans+=curf;
    67     return ans;
    68 }
    69 int main(){
    70     freopen ("optimal.in","r",stdin);
    71     freopen ("optimal.out","w",stdout);
    72     int i,j,k;
    73     while (~scanf("%d%d%d",&K,&C,&M)){
    74         for (i=1;i<=K+C;i++)
    75             for (j=1;j<=K+C;j++){
    76                 a[i][j]=oo;
    77                 int w;
    78                 scanf("%d",&w);
    79                 a[i][j]=min(a[i][j],w);
    80             }
    81         for (k=1;k<=K+C;k++)
    82             for (i=1;i<=K+C;i++)
    83                 for (j=1;j<=K+C;j++)
    84                     a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
    85         int low,high,mid;
    86         low=1,high=oo;
    87         while (low<=high){
    88             mid=(low+high)>>1;
    89             build(mid);
    90             cout<<mid<<' '<<dinic()<<endl;
    91             if (dinic()==C)
    92                 high=mid-1;
    93             else
    94                 low=mid+1;
    95         }
    96         printf("%d
    ",low-1);
    97     }
    98     return 0;
    99 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    toString
    React系列,jsx
    React系列,初识
    如何在数据库中存储一棵树
    Linux-gate.so技术细节
    主引导记录MBR/硬盘分区表DPT/主分区、扩展分区和逻辑分区/电脑启动过程
    8259A工作原理描述
    汇编指令大全
    汇编条件判断整理(JCC,CMP/TEST的实现)
    【汇编】字符串处理指令 stosb、lodsb、movsw、scasb、rep
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/6127253.html
Copyright © 2011-2022 走看看