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

题目大意:

有k个挤奶器,在牧场里有c头奶牛,每个挤奶器可以满足m个奶牛,奶牛和挤奶器都可以看成是实体,现在给出两个实体之间的距离,如果没有路径相连,则为0,现在问你在所有方案里面,这c头奶牛需要走的最大距离的最小值。

分析:

先将题目给出来的距离矩阵跑一下 Floyd 求出全源最短路方便后面建图,

这里注意一下除了对角线的点若有其他点为 0 则应将其值设置为 INF 代表不可达

在使用最大流判断是否存在解的时候,要对每个解都重新建图。

建图需要一个超级源点,把所有的奶牛与源点相连,容量设置为1

把所有的挤奶器与汇点相连,容量为m

然后对于挤奶器和奶牛的距离不超过判断的解的距离的连边,容量设置为1

然后求解即可。如果最大流 == 牛的总数说明可行

AC代码:

    DC.AddEdge(0,k+i,1);
    for(int i=1 ; i<=k ; i++)
    DC.AddEdge(i,n,m);
    for(int i=k+1 ; i<=k+c ; i++)
    for(int j=1 ; j<=k ; j++)
    if(mp[i][j]<=mid)
    DC.AddEdge(i,j,INF);
    return (DC.Maxflow()==c);
}

int main( )
{
   int k,c,m;
   while(scanf("%d%d%d",&k,&c,&m)!=EOF)
   {
       for(int i=1 ; i<=k+c ; i++)
       for(int j=1 ; j<=k+c ; j++)
       {
           scanf("%d",&mp[i][j]);
           if(i!=j&&mp[i][j]==0)
            mp[i][j]=INF;
       }
       FD(k,c);
       int ans;
       while(L<=R)
       {
           int mid = (L+R)>>1;
           if(!ok(mid,k,c,m))
            L = mid+1;
           else
           {
               ans=mid;
               R=mid-1;
           }
       }
       printf("%d\n",ans);
   }
   return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/shuaihui520/p/9157549.html