zoukankan      html  css  js  c++  java
  • 1028 花店橱窗布置

    1028 花店橱窗布置

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
     
     
    题目描述 Description

    假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果。为了取得最佳的美学效果,必须使花的摆放取得最大的美学值。

    输入描述 Input Description

    第一行为两个整数F,V(F<=V<=100)

    接下来F行每行V个整数,第i行第j个数表示第i束花放入第j个花瓶的美学值。

    输出描述 Output Description

    一个整数,即最大美学值。

    样例输入 Sample Input

    2 2

    10 0

    5 2

    样例输出 Sample Output

    12

    数据范围及提示 Data Size & Hint
     

    分类标签 Tags 点此展开 

     
    题解:
    模板:匈牙利算法的升级版--KM算法
    AC代码:
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=110;
    const int inf=0x3f3f3f3f;
    int n,m,ans,match[N],w[N][N],d;
    int fx[N],fy[N],lx[N],ly[N];
    bool dfs(int u){
        fx[u]=1;
        for(int i=1;i<=m;i++){
            if(!fy[i]&&lx[u]+ly[i]==w[u][i]){
                fy[i]=1;
                if(!match[i]||dfs(match[i])){
                    match[i]=u;
                    return 1;
                }
            }
        }
        return 0;
    }
    void KM(){
        for(int i=1;i<=n;i++){
            lx[i]=-inf;
            for(int j=1;j<=m;j++) lx[i]=max(lx[i],w[i][j]);
        }
        for(int i=1;i<=n;i++){
            for(;;){
                memset(fx,0,sizeof fx);
                memset(fy,0,sizeof fy);
                if(dfs(i)) break;
                d=inf;
                for(int j=1;j<=n;j++){
                    for(int k=1;k<=m;k++){
                        if(fx[j]&&!fy[k]){
                            d=min(d,lx[j]+ly[k]-w[j][k]);
                        }
                    }
                }
                if(d==inf) break;
                for(int j=1;j<=n;j++) if(fx[j])lx[j]-=d;
                for(int j=1;j<=m;j++) if(fy[j])ly[j]+=d;
            }
        }
        for(int i=1;i<=m;i++) if(match[i]) ans+=w[match[i]][i];
    }
    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();
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    002-html表格
    001-html常见的标记
    获取本地内外网ip地址
    Windows10设置默认简体美式键盘输入法
    C# 历史版本特性变更
    SQL Server Report Builder RDLC按记录数分页
    自动补全(备份)
    t:datagrid 行编辑 类型备份
    自动生成编号
    文本框上绑校验
  • 原文地址:https://www.cnblogs.com/shenben/p/5934999.html
Copyright © 2011-2022 走看看