1. 程式人生 > >Vijos CoVH之柯南開鎖 (二分圖)

Vijos CoVH之柯南開鎖 (二分圖)

輸入 但是 我們 getc etc 圖片 sca data getch

背景

隨著時代的演進,困難的刑案也不斷增加...
但真相只有一個
雖然變小了,頭腦還是一樣好,這就是名偵探柯南!

描述

[CoVH06]
面對OIBH組織的囂張氣焰, 柯南決定深入牛棚, 一探虛實.
他經過深思熟慮, 決定從OIBH組織大門進入...........

OIBH組織的大門有一個很神奇的鎖.
鎖是由M*N個格子組成, 其中某些格子凸起(灰色的格子). 每一次操作可以把某一行或某一列的格子給按下去.
技術分享
如果柯南能在組織限定的次數內將所有格子都按下去, 那麽他就能夠進入總部. 但是OIBH組織不是吃素的, 他們的限定次數恰是最少次數.

請您幫助柯南計算出開給定的鎖所需的最少次數.

格式

輸入格式

第一行 兩個不超過100的正整數N, M表示矩陣的長和寬
以下N行 每行M個數 非0即1 1為凸起方格

輸出格式

一個整數 所需最少次數

樣例1

樣例輸入1

4 4
0000
0101
0000
0100
Copy

樣例輸出1

2
Copy

限制

全部1秒

提示

OIBH組織的第一道防線居然被柯南突破了. 這引起了OIBH組織的高度重視, 他們派出了黃金十二人+青銅五小強進行抵抗.

 1 /*
 2     一個很老的經典的二分圖的梗了
 3     看成兩部分分別為(1..n)和(1..m)的二分圖
 4     若(x,y)=1 則給x-->y連條邊
5 問題轉化為選出最少的點使以這些點為端點的所有邊的集合為所有邊的集合 6 也就是最小點覆蓋數了 7 根據K?nig定理我們可以知道 二分圖的最大匹配等於這個圖的最小點覆蓋數 8 這個鬼東西自己記下來就好了 9 */ 10 #include<iostream> 11 #include<cstring> 12 #include<cstdio> 13 #define MAXN 102 14 15 using namespace std; 16 17 int map[MAXN][MAXN],n,m,link[MAXN],ans;
18 bool vis[MAXN]; 19 20 char x; 21 22 inline bool find(int x) { 23 for(int i=1;i<=m;i++) { 24 if(!vis[i]&&map[x][i]) { 25 vis[i]=true; 26 if(link[i]==0||find(link[i])) { 27 link[i]=x; 28 return true; 29 } 30 } 31 } 32 return false; 33 } 34 35 int main() { 36 scanf("%d%d",&n,&m); 37 getchar(); 38 for(int i=1;i<=n;i++) { 39 for(int j=1;j<=m;j++) { 40 cin>>x; 41 if(x==1) map[i][j]=1; 42 } 43 getchar(); 44 } 45 for(int i=1;i<=n;i++) { 46 memset(vis,0,sizeof vis); 47 if(find(i)) ans++; 48 } 49 printf("%d\n",ans); 50 return 0; 51 }

Vijos CoVH之柯南開鎖 (二分圖)