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 }
  • 相关阅读:
    PAT A1094 The Largest Generation (25 分)——树的bfs遍历
    PAT A1055 The World's Richest (25 分)——排序
    PAT A1052 Linked List Sorting (25 分)——链表,排序
    PAT A1076 Forwards on Weibo (30 分)——图的bfs
    辅导员
    辅导员面试
    C程序设计
    Excel VBA 基本概念
    Excel函数
    导入excel表的数据到数据库ssh
  • 原文地址:https://www.cnblogs.com/naix-x/p/3245080.html
Copyright © 2011-2022 走看看