题意:安排牛进牛棚。赤裸裸的二分图匹配。 注意:是多case 可以去多仔细看看匈牙利算法。 代码: #include <iostream> using namespace std; int map[205][205],m,n,cy[205],f[205]; //f数组为标记的。cy保存匹配的情况 int path(int t) { int i; for(i = 1; i <= m ; i++) { if(!f[i] && map[t][i]) { f[i] = 1; //标记已近被搜索了。 if(cy[i]== 0 || path(cy[i])) //递归寻找上一个的 所以说最先被匹配的可能对他的操作越多 { cy[i] = t; return 1; //找到了就返回。 } } } return 0; } int main() { int i , j,k; while(scanf("%d%d",&n,&m)!=EOF) { int t; memset(map,0,sizeof(map)); memset(cy,0,sizeof(cy)); for(i = 1 ; i <= n ; i++) //输入数据 建立图 { scanf("%d",&k); while(k--) { scanf("%d",&t); map[i][t] = 1; } } int co = 0; for(i = 1 ;i <= n ;i++) { memset(f,0,sizeof(f)); if(path(i)) { co++; } } cout<<co<<endl; } return 0; }