zoukankan      html  css  js  c++  java
  • POJ 2112: Optimal Milking【二分,网络流】

    题目大意:K台挤奶机,C个奶牛,每台挤奶器可以供M头牛使用,给出奶牛和和机器间的距离矩阵,求所有奶牛走最大距离的最小值

    思路:最大距离的最小值,明显提示二分,将最小距离二分之后问题转化成为:K台挤奶机,C个奶牛,每台挤奶器可以供M头牛使用,已知每头牛可以到的挤奶机是哪些,问能否让所有奶牛挤上奶。

    这个问题就是典型的二分图多重匹配问题,跑个网络流看是否满流即可,最后才发现给出的矩阵不一定是最短路径TUT 所以要跑一遍floyd

    #include<iostream>

    #include<cstdio>

    #include <queue>

    #include <string.h>

    #define maxn 100000

    #define inf 200000

    using namespace std;

    int head[maxn],point[maxn],next[maxn],flow[maxn];

    int dis[maxn],now=0,dist[maxn];

    int map[300][300],k,c,m,cop[maxn];

    void floyd(int n){

        for(int k=1;k<=n;k++)

            for(int i=1;i<=n;i++)if(i!=k)

                for(int j=1;j<=n;j++)if(j!=i && j!=k)

                    map[i][j]=min(map[i][j],map[i][k]+map[k][j]);

    }

    void add(int x,int y,int v,int vv){

        next[++now]=head[x];head[x]=now;point[now]=y;flow[now]=v;

        dis[now]=vv;next[++now]=head[y];head[y]=now;point[now]=x;flow[now]=0;dis[now]=vv;

    }

    int bfs(int s,int t,int x)

    {

        memset(dist,-1,sizeof(dist));

        dist[s]=0;queue<int>q;q.push(s);

        while(!q.empty())

        {

            int u=q.front();q.pop();

            for(int i=head[u];i;i=next[i])

            {

                int k=point[i];

                if(dist[k]==-1 && flow[i]!=0 && dis[i]<=x)

                {

                    dist[k]=dist[u]+1;q.push(k);

                }

            }

        }return dist[t]!=-1;

    }

    int dfs(int s,int d,int t,int x)

    {

        if(s==t)return d;int res=0;

        for(int i=head[s];i&&res<d;i=next[i])

        {

            int u=point[i];

            if(dist[u]==dist[s]+1 && flow[i]&& dis[i]<=x)

            {

                int dd=dfs(u,min(d-res,flow[i]),t,x);

                if(dd){

                    flow[i]-=dd;flow[((i-1)^1)+1]+=dd;res+=dd;

                }

            }

        }

        if(res==0)dist[s]=-1;return res;

    }

    int judge(int x,int s,int t)

    {

        int ans=0;

        while(bfs(s,t,x))ans+=dfs(s,inf,t,x);

        memcpy(flow,cop,sizeof(flow));

        if(ans==c)return 1;else return 0;

    }

    int main()

    {

        scanf("%d%d%d",&k,&c,&m);

        int s=k+c+10,t=k+c+11,l=0,r=20000;

        for(int i=1;i<=k+c;i++)

            for(int j=1;j<=k+c;j++)

            {

                scanf("%d",&map[i][j]);if(map[i][j]==0)map[i][j]=inf;

            }

        floyd(k+c);

        for(int i=k+1;i<=k+c;i++)

            for(int j=1;j<=k;j++)

                if(map[i][j]!=inf) add(i,j,1,map[i][j]);

        for(int i=1;i<=k;i++)add(i,t,m,0);

        for(int i=k+1;i<=k+c;i++)add(s,i,1,0);

        memcpy(cop,flow,sizeof(flow));

        while(l<r)

        {

            int mid=(l+r)>>1;

            if(judge(mid,s,t))r=mid;else l=mid+1;

        }

        printf("%d ",l);

        return 0;

    }

  • 相关阅读:
    mysql 状态查看
    Float浮点内存存储方式 转
    printf("%d",5.01)和printf("%f",5)的输出结果
    RMBP
    小D课堂【SpringBoot】接口Http协议开发实战
    尚硅谷【SpringBoot】web(源码讲解太多不建议阅读)
    尚硅谷【SpringBoot】入门
    51cto-spring boot(一Spring4快速入门)
    Eclipse使用Maven时出现:Index downloads are disabled, search results may be incomplete.问题解决
    maven(二)
  • 原文地址:https://www.cnblogs.com/philippica/p/4112455.html
Copyright © 2011-2022 走看看