[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 Num;char ch;
 7     while((ch=getchar())<‘0‘||ch>‘9‘);Num=ch-‘0‘;
 8     while((ch=getchar())>=‘0‘&&ch<=‘9‘) Num=Num*10+ch-‘0‘;
 9     return Num;
10 }
11 int N;
12 bool A[55],B[55];
13 int to[2510],ne[2510],fir[110],cnt;
14 void Add(int a,int b){
15     to[++cnt]=b;
16     ne[cnt]=fir[a];
17     fir[a]=cnt;
18 }
19 bool vis[110];
20 int match[110];
21 int Dfs(int u){
22     for(int i=fir[u];i!=-1;i=ne[i]){
23         int v=to[i];
24         if(!vis[v]){
25             vis[v]=true;
26             if(match[v]==-1||Dfs(match[v])){
27                 match[v]=u;
28                 return true;
29             }
30         }
31     }
32     return false;
33 }
34 int Hungary(){
35     memset(match,-1,sizeof(match));
36     int ret=0;
37     for(int i=1;i<=N;i++){
38         if(A[i]&&B[i]) continue;
39         memset(vis,false,sizeof(vis));
40         if(Dfs(i)) ret++;
41     }
42     return ret;
43 }
44 int main(){
45     int Test=readint();
46     while(Test--){
47         memset(fir,-1,sizeof(fir));
48         cnt=0;
49         N=readint();
50         for(int i=1;i<=N;i++) A[i]=readint();
51         for(int i=1;i<=N;i++) B[i]=readint();
52         for(int i=1;i<=N;i++)
53             for(int j=1;j<=N;j++){
54                 bool x=readint();
55                 if(!x||(!A[j])||(A[i]&&B[i])) continue;
56                 Add(i,j+N);
57             }
58         for(int i=1;i<=N;i++)
59             if(A[i]&&(!B[i]))
60                 Add(i,i+N);
61         int tot=N;
62         for(int i=1;i<=N;i++)
63             if(A[i]&&B[i])
64                 tot--;
65         int Ans=Hungary();
66         if(Ans<tot) printf("%c%c%c\n",84,95,84);
67         else printf("%c%c%c\n",94,95,94);
68     }
69     return 0;
70 }
时间: 2024-07-30 11:50:23

[BZOJ1433][ZJOI2009]假期的宿舍 二分图匹配的相关文章

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

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

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

bzoj1433 [ZJOI2009]假期的宿舍(最大流)

1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1717  Solved: 754[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 ≤

bzoj1433 [ZJOI2009]假期的宿舍 最大流

[ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3429  Solved: 1459[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 ≤ 50,1

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 <=

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

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

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

[BZOJ1433][luogu_P2055][ZJOI2009]假期的宿舍

[BZOJ1433][luogu_P2055][ZJOI2009]假期的宿舍 试题描述 输入 输出 输入示例 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 输出示例 ^_^ 数据规模及约定 对于 \(30\texttt{%}\) 的数据满足 \(1 \le n \le 12\). 对于 \(100\texttt{%}\) 的数据满足 \(1 \le n \le 50,1 \le T \le 20\). 题解 每个人和每个人的床分别建一个节点,源点向不回家的和不是学生的人连边