• 花店橱窗布置(带权二分图最大匹配)


    花店橱窗布置

    题目描述:
    假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果。为了取得最佳的美学效果,必须使花的摆放取得最大的美学值。
    输入描述:
    第一行为两个整数F,V(F<=V<=100)
    接下来F行每行V个整数,第i行第j个数表示第i束花放入第j个花瓶的美学值。
    输出描述 Output Description
    一个整数,即最大美学值。
    样例输入:
    2 2
    10 0
    5 2
    样例输出:
    12

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=110;
    const int inf=0x7fffffff;
    int n,m,w[maxn][maxn],lx[maxn],ly[maxn],from[maxn],to[maxn];
    bool s[maxn],t[maxn];
    bool find(int x)
    {
        s[x]=1;
        for(int i=1;i<=m;i++)
        if(lx[x]+ly[i]==w[x][i]&&!t[i])
        {
            t[i]=1;
            if(!from[i]||find(from[i]))
            {
                from[i]=x;
                to[x]=i;
                return 1;
            }
        }
        return 0;
    }
    void update()
    {
        int d=inf;
        for(int i=1;i<=n;i++)
        if(s[i])
        for(int j=1;j<=m;j++)
        if(!t[j])
        d=min(d,lx[i]+ly[j]-w[i][j]);
        for(int i=1;i<=n;i++)
        if(s[i]) lx[i]-=d;
        for(int j=1;j<=m;j++)
        if(t[j]) ly[j]+=d;
    }
    void km()
    {
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
          lx[i]=max(lx[i],w[i][j]);
        for(int i=1;i<=n;i++)
        for(;;)
        {
            memset(s,0,sizeof(s));
            memset(t,0,sizeof(t));
            if(find(i)) break;
            else update();
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
          scanf("%d",&w[i][j]);
        km();
        int ans=0;
        for(int i=1;i<=n;i++)
        ans+=w[i][to[i]];
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    软件工程学习总结
    第13次作业--邮箱的正则表达式
    第12次作业--你的生日
    第11次作业--字符串处理
    第10次作业
    找回感觉的练习
    基础网络流学习笔记
    卷积定理的证明
    快速xxx变换相关
    主席树相关
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070882.html
Copyright © 2020-2023  润新知