1 条题解

  • 0
    @ 2025-5-4 15:00:08

    本题要求根据奶牛对畜栏的偏好,计算能实现产奶的最大畜栏分配数量。代码采用匈牙利算法解决二分图最大匹配问题。

    数据存储:用二维数组map记录每头牛对不同畜栏的意愿(map[i][j]为1表示第i头牛愿意去第j个畜栏)。数组guishu记录每个畜栏当前匹配的奶牛编号(初始化为-1表示未匹配),cover数组标记每次搜索中畜栏是否被访问过。 核心算法:dfs函数实现匈牙利算法核心逻辑。对每头牛i,遍历其愿意去的畜栏j,若j未被访问且该畜栏未匹配奶牛,或其已匹配奶牛能找到其他可匹配畜栏(通过递归调用dfs(guishu[i])) ,则更新匹配关系,即guishu[j]=i,并返回true。在main函数中,对每头牛调用dfs,若成功匹配则答案ans加1。

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <string>
    #include <queue>
    #include <algorithm>
    #include <stack>
    #include <vector>
     
    using namespace std;
    /*
     用二维数组记录每头牛想去的位置信息
     标记记录位置被访问的情况
     主要运用  匈牙利算法
     */
    int n,m,ans;
    int map[1005][1005];
    int guishu[1005];
    bool cover[1005];
     
    bool dfs(int x){
        for(int i=1;i<=m;i++){
            if(map[x][i]&&!cover[i]){
                cover[i]=1;
                if(guishu[i]==-1||dfs(guishu[i])){//匈牙利算法核心
                    guishu[i]=x;
                    return 1;
                }
            }
        }
        return 0;
    }
     
    int main(){
        while (cin>>n>>m) {
            ans=0;
            int num,y;
            memset(map,0,sizeof(map));
            
            for(int i=0;i<n;i++){
                cin>>num;
                while(num--){
                    cin>>y;
                    map[i][y]=1;
                }
            }
            memset(guishu,-1,sizeof(guishu));
            for(int i=0;i<n;i++){
                memset(cover,0,sizeof(cover));
                if(dfs(i))
                    ans++;
                
            }
            cout<<ans<<endl;  
        }
        return 0;
    }
    • 1

    信息

    ID
    275
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    1
    上传者