bzoj1433: [ZJOI2009]假期的宿舍 [二分图][二分图最大匹配]
2024-09-06 02:48:20
Description
Input
Output
Sample Input
1
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0
Sample Output
ˆ ˆ
HINT
对于30% 的数据满足1 ≤ n ≤ 12。
对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。
最近被二分图到底要用邻接矩阵还是邻接表搞得十分分裂。。
还是看图的稠密程度吧???
这题的建图十分经典,对于每一个本校学生对自己的床连边,其他连边同输入的矩阵。
本质虽然是匈牙利算法求二分图最大匹配,事实上不用把最大匹配求出来,只要增广到对于一个需要住校的人没有床睡就好了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int maxn=;
int T,n,n_l,n_r;
int E[maxn][maxn],stu[maxn],hom[maxn],mat[maxn];
bool check[maxn]; bool dfs(int x){
for(int i=;i<=n_r;i++)
if(stu[i]&&E[x][i]&&!check[i]){
check[i]=;
if(mat[i]==-||dfs(mat[i])){
mat[i]=x;
return ;
}
}
return ;
} bool hungary(){
memset(mat,-,sizeof mat);
for(int i=;i<=n;i++){
memset(check,,sizeof check);
if(!hom[i]&&!dfs(i)) return ;
}
return ;
} void init(){
scanf("%d",&n); n_l=n_r=n;
for(int i=;i<=n;i++) scanf("%d",&stu[i]);
for(int i=;i<=n;i++){
scanf("%d",&hom[i]);
if(!stu[i]) hom[i]=;
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
scanf("%d",&E[i][j]);
if(stu[i]) E[i][i]=;
}
} int main(){
scanf("%d",&T);
while(T--){
init();
puts(hungary()?"^_^":"T_T");
}
return ;
}
最新文章
- centos7 docker redis
- ganglia安装简记
- docker图形界面工具
- [团队项目]expat不兼容BUG
- thinkphp中curl的使用,常用于接口
- 打造属于自己的Altium Designer 3D封装库,不需要懂专门的三维设计软件
- Python 变量有效范围
- python-cmp()的使用
- linux下mongodb安装、服务器、客户端、备份、账户命令
- Java 疑问自问自答
- Mysql表结构导出excel(含数据类型、字段备注注释)
- svn 恢复删除文件
- Ajax使用formdata异步上传文件,报错the request was rejected because no multipart boundary was found
- Scala进阶之路-Spark独立模式(Standalone)集群部署
- Linux上统计文件夹下文件个数以及目录个数
- Django的视图函数和路由系统中一些没有用过的小点
- js-ES6学习笔记-Generator函数
- 我为什么要学Go语言
- mysql_use_result &; mysql_store_result &; MYSQLI_ASYNC
- 洛谷P1129 [ZJOI2007] 矩阵游戏