BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html
题目传送门 - BZOJ1433
题解
我们理一理题目。
在校的学生,有自己的床,还可以睡朋友的床。
离校的学生,不占床。
外来的学生,只能睡朋友的床。
然后就是一个裸的二分图匹配了。
代码
#include <cstring> #include <cstdlib> #include <cmath> #include <cstdio> #include <algorithm> using namespace std; const int N=55; int T,n,g[N][N],a[N],b[N]; int match[N],vis[N]; int Match(int x){ for (int i=1;i<=n;i++) if (!vis[i]&&g[x][i]){ vis[i]=1; if (!match[i]||Match(match[i])){ match[i]=x; return 1; } } return 0; } int hungray(){ memset(match,0,sizeof match); for (int i=1;i<=n;i++) if (!b[i]){ memset(vis,0,sizeof vis); if (!Match(i)) return 0; } return 1; } int main(){ scanf("%d",&T); while (T--){ scanf("%d",&n); memset(g,0,sizeof g); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) scanf("%d",&b[i]); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++){ scanf("%d",&g[i][j]); if (!a[j]) g[i][j]=0; } for (int i=1;i<=n;i++){ if (a[i]) g[i][i]=1; else b[i]=0; } puts(hungray()?"^_^":"T_T"); } return 0; }