1. 程式人生 > >BZOJ 1433 ZJOI2009 假期的宿舍

BZOJ 1433 ZJOI2009 假期的宿舍

student clu 模板 scan size pre main while bool

二分圖匹配的模板題目,不過建圖的時候請細心細心。
對了 請勿忘記每次的初始化,不然你會爆0.

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4  
 5 bool used[105],bed[233][233];
 6 bool IsStudent[105];
 7 int fa[105],GoHome[105];
 8 int n,m;
 9 int T;
10  
11 bool find(int x){
12     for(int i=1;i<=n;i++){
13 if(!used[i] && bed[x][i]){ 14 used[i]=true; 15 if(!fa[i] || find(fa[i])){ 16 fa[i]=x; 17 return 1; 18 } 19 } 20 } 21 return 0; 22 } 23 24 int main(){ 25 scanf("%d",&T); 26 while
(T--){ 27 memset(bed,0,sizeof(bed)); 28 memset(fa,0,sizeof(fa)); 29 memset(IsStudent,0,sizeof(IsStudent)); 30 memset(GoHome,0,sizeof(GoHome)); 31 int ans = 0,tot=0; 32 scanf("%d",&n); 33 for(int i=1;i<=n;i++){ 34 scanf("%d",&IsStudent[i]);
35 } 36 for(int i=1;i<=n;i++){ 37 int x; 38 scanf("%d",&x); 39 if(IsStudent[i]){ 40 if(x==1) GoHome[i]=1,ans++; 41 } 42 } 43 for(int i=1;i<=n;i++){ 44 for(int j=1;j<=n;j++){ 45 int x; 46 scanf("%d",&x); 47 if(GoHome[i]) continue; 48 if(i==j && IsStudent[i]){ 49 bed[i][i]=1; 50 continue; 51 } 52 if(x){ 53 if(GoHome[i] && !GoHome[j]) bed[j][i]=1; 54 else if(!GoHome[i] && GoHome[j]) bed[i][j]=1; 55 else if(!GoHome[i] && !GoHome[j] ){ 56 if(IsStudent[i] && IsStudent[j]){ 57 bed[i][j]=1; 58 bed[j][i]=1; 59 } 60 else if(!IsStudent[i] && IsStudent[j]) bed[i][j]=1; 61 else if(IsStudent[i] && !IsStudent[j]) bed[j][i]=1; 62 } 63 } 64 } 65 } 66 /*for(int i=1;i<=n;i++) 67 { 68 for(int j=1;j<=n;j++) 69 { 70 printf("i:%d j:%d bed:%d\n",i,j,bed[i][j]); 71 } 72 }*/ 73 for(int i=1;i<=n;i++){ 74 memset(used,0,sizeof(used)); 75 if(find(i)) tot++; 76 } 77 if(tot>=n-ans){ 78 printf("^_^\n"); 79 } 80 else printf("T_T\n"); 81 } 82 }

BZOJ 1433 ZJOI2009 假期的宿舍