假期的宿舍——二分图模板一个

  因为题目并没有给出自己认识自己的数据,所以需要手动从每一个学生向他的床上连一条边,找这个错误找了一个小时。

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 using namespace std;
 7 const int N=77;
 8 int n,p,beds,res,bed[N],mx[N],my[N];
 9 bool st[N],gone[N],gr[N][N],vis[N];
10
11 bool dfs(int x){
12     for(int i=1;i<=beds;i++)
13         if(gr[x][i]&&!vis[i]){
14             vis[i]=true;
15             if(my[i]==0||dfs(my[i])){
16                 mx[x]=i;
17                 my[i]=x;
18                 return true;
19             }
20         }
21     return false;
22 }
23
24 int main(){
25     int T;cin>>T;
26     while(T--){
27         memset(st,0,sizeof st);memset(gone,0,sizeof gone);memset(gr,0,sizeof gr);
28         memset(bed,0,sizeof bed);memset(mx,0,sizeof mx);memset(my,0,sizeof my);
29         cin>>n;
30         beds=res=0;p=n;
31         for(int i=1;i<=n;i++){
32             cin>>st[i];
33             if(st[i])bed[i]=++beds;
34         }
35         for(int i=1;i<=n;i++){
36             cin>>gone[i];
37             if(gone[i]==1&&st[i])p--;
38             else gone[i]=0;
39         }
40
41         for(int i=1;i<=n;i++){
42             if(st[i])gr[i][bed[i]]=true;
43             for(int j=1;j<=n;j++){
44                 bool x;cin>>x;
45                 if(x){
46                     if(st[j])gr[i][bed[j]]=true;
47                     if(st[i])gr[j][bed[i]]=true;
48                 }
49             }
50         }
51
52         for(int i=1;i<=n;i++)
53             if(!(gone[i]&&st[i])&&mx[i]==0){
54                 memset(vis,0,sizeof vis);
55                 res+=dfs(i);
56             }
57
58         cout<<(res>=p?"^_^":"T_T")<<endl;
59     }
60     return 0;
61 }

Method_01

  洛谷 AJAX 32ms

时间: 2024-10-09 13:25:37

假期的宿舍——二分图模板一个的相关文章

BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法

原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html 题目传送门 - BZOJ1433 题解 我们理一理题目. 在校的学生,有自己的床,还可以睡朋友的床. 离校的学生,不占床. 外来的学生,只能睡朋友的床. 然后就是一个裸的二分图匹配了. 代码 #include <cstring> #include <cstdlib> #include <cmath> #include <cstdio> #includ

BZOJ 1433 假期的宿舍 二分图匹配

这道题目不难,二分图匹配建模比较明显.加油吧!相信自己.(自己写的,好开心,40毫秒,比ccz略快). 尽管算法模版是抄一本书上的,但这次很明显我是背出来的.不算抄. 1 #include<cstdio> 2 #include<iostream> 3 #include<vector> 4 #include<queue> 5 #include<cstring> 6 #define rep(i,j,k) for(int i = j; i <=

[BZOJ1433][ZJOI2009]假期的宿舍 二分图匹配

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1433 首先留在学校的学生向自己的床连边. 要住在学校里的人向认识的学生的床连边. 跑二分图匹配,看匹配的数量是否等于住在学校的人数. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int inline readint(){ 6 int N

P2055 [ZJOI2009]假期的宿舍 - 二分图最大匹配

把人和床分开考虑,题目说每个人只能睡和自己直接认识的人的床,就是一种边的关系,但是并不是人与人,实际上人与人之间连边是很难处理的,但是如果把人和床连边,就是一张二分图,左右两边分别是不同的东西,然后求一下最大匹配就好了 没思路的时候换换角度,看能不能搞出什么"新东西"来 注意多组数据不超时的情况下能用memset尽量用,有时候感觉某个数组可以不清空但实际上是需要清空的 还有注意连边的时候没那么简单...看注释吧 #include <algorithm> #include &

假期的宿舍 二分图

Code: #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<algorithm> using namespace std; const int maxn=300; const int INF=1000000+233; int C[maxn][maxn],is[maxn],home[maxn],idx[maxn]; int s,t; struc

bzoj1433: [ZJOI2009]假期的宿舍

1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2286  Solved: 969[Submit][Status][Discuss] Description Input Output Sample Input 131 1 00 1 00 1 11 0 01 0 0 Sample Output ˆ ˆ HINT 对于30% 的数据满足1 ≤ n ≤ 12.对于100% 的数据满足1 ≤ n ≤ 50,1 ≤

bzoj1433[ZJOI2009]假期的宿舍(匈牙利)

1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2544  Solved: 1074 [Submit][Status][Discuss] Description Input Output Sample Input 1 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

假期的宿舍

假期的宿舍 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1433 二分图匹配(最大流) 做到Candy(http://acm.split.hdu.edu.cn/showproblem.php?pid=4322)这道题,用A*写了半天TLE了,去网上搜题解,都是网络流的做法.问艾神用搜索做该怎么剪枝,艾神说他写的书上有讲很多剪枝策略,然而最快三天后书才能到....,所以就先试试网络流了. 之前没怎么接触过网络流,看了半天才看懂一些,于是

bzoj1433:[ZJOI2009]假期的宿舍

明显的二分图最大匹配. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<bitset> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c