1 条题解
-
0
本题要求根据奶牛对畜栏的偏好,计算能实现产奶的最大畜栏分配数量。代码采用匈牙利算法解决二分图最大匹配问题。
数据存储:用二维数组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
- 上传者