/* 最小点覆盖 == 最大二分匹配 ,mode_0 不需要记录因为初始值就是mode_0 */
1 int find(int x)
2 {
3 for(int j=0;j<m;j++)
4 {
5 if(vis[j] || !map[x][j]) continue;
6 vis[j] = 1;
7 if(d[j]==-1 || find(d[j]))
8 {
9 d[j] = x;
10 p[x] = j;
11 return true;
12 }
13 }
14 return false;
15 }
16  void solve()
17 {
18 int ans = 0;
19 memset(d,-1,sizeof(d));
20 memset(p,-1,sizeof(p));
21 for(int i=0;i<n;i++)
22 {
23 if(p[i]==-1){
24 memset(vis,0,sizeof(vis));
25 if(find(i))
26 ans++;}
27 }
28 cout<<ans<<endl;
29 }
 posted on 2011-04-13 14:12  eth0  阅读(211)  评论(0编辑  收藏  举报