bzoj1059: [ZJOI2007]矩阵游戏(二分图匹配)
1059: [ZJOI2007]矩阵游戏
题目:传送门
题解:
为了赶上苏大佬的光速的脚步...刷了题水题,不过苏大佬好像一早就搞定了,所以也没有什么关系了对吧!
其实说水题的话还不能完全算是,但如果要是发散一下思维很容易就精A:
因为对于同一列或者同一行的棋子来说,不论如何变化,始终都在同一列或者同一行。
那么如果能够组成对角线,那只要找到n个不能同行也不能同列的棋子就ok啊。
再细想一下,解法就是公牛母牛配啊
代码:
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int f[1100]; 5 int n,m,ans; 6 bool map[510][510]; 7 bool c[510]; 8 bool find_muniu(int x) 9 { 10 for(int j=1;j<=n;j++) 11 if(map[x][j]) 12 if(c[j]==true) 13 { 14 c[j]=false; 15 if(f[j]==0 || find_muniu(f[j])) 16 { 17 f[j]=x; 18 return true; 19 } 20 } 21 return false; 22 } 23 int main() 24 { 25 int T; 26 scanf("%d",&T); 27 while(T--) 28 { 29 scanf("%d",&n); 30 memset(map,false,sizeof(map)); 31 for(int i=1;i<=n;i++) 32 for(int j=1;j<=n;j++) 33 scanf("%d",&map[i][j]); 34 int ans=0; 35 memset(f,0,sizeof(f)); 36 for(int i=1;i<=n;i++) 37 { 38 memset(c,true,sizeof(c)); 39 if(find_muniu(i)==true)ans++; 40 } 41 if(ans<n)printf("No\n"); 42 else printf("Yes\n"); 43 } 44 return 0; 45 }