zoukankan      html  css  js  c++  java
  • POJ 2112 Optimal Milking(最大流+二分)

    题目链接

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

      1 #include <cstdio>
      2 #include <string>
      3 #include <cstring>
      4 #include <queue>
      5 #include <map>
      6 #include <algorithm>
      7 using namespace std;
      8 #define INF 0x3ffffff
      9 struct node
     10 {
     11     int u,v,next,re,w;
     12 } edge[200001];
     13 int first[501],dis[501];
     14 int p[251][251];
     15 int t;
     16 int sv,ev,K,C,M;
     17 void CL()
     18 {
     19     t = 1;
     20     memset(first,-1,sizeof(first));
     21 }
     22 void add(int u,int v,int w)
     23 {
     24     edge[t].u = u;
     25     edge[t].v = v;
     26     edge[t].w = w;
     27     edge[t].re = t+1;
     28     edge[t].next = first[u];
     29     first[u] = t++;
     30     edge[t].u = v;
     31     edge[t].v = u;
     32     edge[t].w = 0;
     33     edge[t].re = t-1;
     34     edge[t].next = first[v];
     35     first[v] = t ++;
     36 }
     37 int bfs()
     38 {
     39     int u,v,i;
     40     memset(dis,0xff,sizeof(dis));
     41     queue<int> que;
     42     que.push(sv);
     43     dis[sv] = 0;
     44     while(!que.empty())
     45     {
     46         u = que.front();
     47         que.pop();
     48         for(i = first[u]; i != -1; i = edge[i].next)
     49         {
     50             v = edge[i].v;
     51             if(edge[i].w > 0&&dis[v] < 0)
     52             {
     53                 dis[v] = dis[u] + 1;
     54                 que.push(v);
     55             }
     56         }
     57     }
     58     if(dis[ev] > 0) return 1;
     59     else return 0;
     60 }
     61 int dfs(int u,int step)
     62 {
     63     int i,a = 0,v,flag = 0;
     64     if (u == ev) return step;
     65     for (i = first[u];i != -1&&flag < step; i = edge[i].next)//flag<step
     66     {
     67         v = edge[i].v;
     68         if (edge[i].w > 0&& dis[v] == dis[u]+1&&(a = dfs(v,min(step,edge[i].w))))
     69         {
     70             edge[i].w -= a;
     71             flag += a;//这里
     72             edge[edge[i].re].w += a;
     73             return a;
     74         }
     75     }
     76     if(flag == 0) dis[u] = -1;//这里
     77     return flag;
     78 }
     79 void build(int x)
     80 {
     81     int i,j;
     82     CL();
     83     for(i = 1; i <= K; i ++)
     84     {
     85         add(0,i,M);
     86     }
     87     for(i = 1; i <= K; i ++)
     88     {
     89         for(j = 1; j <= C; j ++)
     90         {
     91             if(p[i][j+K] <= x)
     92             add(i,K+j,1);
     93         }
     94     }
     95     for(i = 1;i <= C;i ++)
     96     {
     97         add(i+K,ev,1);
     98     }
     99 }
    100 int fun(int x)
    101 {
    102     int ans = 0,res;
    103     build(x);
    104     while(bfs())
    105     {
    106           while(res=dfs(sv,INF))
    107           ans += res;
    108     }
    109     if(ans == C)
    110         return 1;
    111     else
    112         return 0;
    113 }
    114 int bin(int l,int r)
    115 {
    116     int str,mid,end;
    117     str = l;
    118     end = r;
    119     while(str < end)
    120     {
    121         mid = (str + end)/2;
    122         if(fun(mid))
    123         {
    124             end = mid;
    125         }
    126         else
    127         {
    128            str = mid + 1;
    129         }
    130     }
    131     return end;
    132 }
    133 int main()
    134 {
    135     int i,j,k;
    136     while(scanf("%d%d%d",&K,&C,&M)!=EOF)
    137     {
    138         for(i = 1;i <= K+C;i ++)
    139         {
    140             for(j = 1;j <= K+C;j ++)
    141             {
    142                 scanf("%d",&p[i][j]);
    143                 if(i != j&&p[i][j] == 0)
    144                 p[i][j] = INF;
    145             }
    146         }
    147         for(i = 1;i <= K+C;i ++)
    148         {
    149             for(j = 1;j <= K+C;j ++)
    150             {
    151                 for(k = 1;k <= K+C;k ++)
    152                 {
    153                     if(p[j][k] > p[j][i] + p[i][k])
    154                     p[j][k] = p[j][i] + p[i][k];
    155                 }
    156             }
    157         }
    158         sv = 0;
    159         ev = K+C+1;
    160         int maxz = 0;
    161         for(i = 1;i <= K+C;i ++)
    162         {
    163             for(j = 1;j <= K+C;j ++)
    164             maxz = max(maxz,p[i][j]);
    165         }
    166         printf("%d
    ",bin(0,maxz));
    167     }
    168     return 0;
    169 }
  • 相关阅读:
    《网络》:关于计算机网络的必备常识【无序】(不定时更新)
    《网络》:设置三个密码:通过console口连接设备,进入特权模式,登录Telnet
    《网络》:交换机基本配置命令
    启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决
    java之servlet小记
    Nokia大事录
    Android之HandlerThread
    Android进程间的通信之AIDL
    Android进程间的通信之Messenger
    Loaders
  • 原文地址:https://www.cnblogs.com/naix-x/p/3245080.html
Copyright © 2011-2022 走看看