poj 2226 Muddy Fields 最小顶点覆盖

题目链接:http://poj.org/problem?id=2226

这道题跟上一道很相似不同之处在于这里不是整行或者整列的删,而是连续的几个可以一起删,不连的不能删,这就要对原图进行处理,对原有的图行由上到下,列由左到右进行编号,作为x集合,在同一行且连续的编号一样,然后对原有的图列由左到右,行由上到下重新编号,作为y集合。之后就是二分图求最大匹配。

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int MAX=55;
 6 int visit[20*MAX];
 7 int map[MAX][MAX];
 8 int res[20*MAX][20*MAX];
 9 int use[20*MAX];
10 int n,m,xx,yy;
11 int solve(int x)
12 {
13     int i;
14     for(i=1;i<=yy;i++)
15         if(res[x][i]&&!visit[i])
16         {
17             visit[i]=1;
18             if(use[i]==-1||solve(use[i]))
19             {
20                 use[i]=x;
21                 return 1;
22             }
23         }
24         return 0;
25 }
26 int match()
27 {
28     int i,count=0;
29     for(i=1;i<=xx;i++)
30     {
31         memset(visit,0,sizeof(visit));
32         if(solve(i))count++;
33     }
34     return count;
35 }
36 void build()
37 {
38     int i,j,k;
39     k=0;
40     for(i=1;i<=n;i++)
41         for(j=1;j<=m;)
42             if(map[i][j]){
43                 k++;
44                 while(j<=m&&map[i][j])
45                     map[i][j++]=k;
46             }
47             else j++;
48             xx=k;
49             k=0;
50             for(j=1;j<=m;j++)
51                 for(i=1;i<=n;)
52                     if(map[i][j]){
53                         k++;
54                         while(i<=n&&map[i][j])
55                         {
56                             res[map[i][j]][k]=1;
57                             i++;
58                         }
59                     }
60                     else i++;
61                     yy=k;
62 }
63 int main()
64 {
65     int i,j;
66     char ch;
67     while(scanf("%d%d",&n,&m)!=EOF)
68     {
69         memset(map,0,sizeof(map));
70         memset(res,0,sizeof(res));
71         memset(use,-1,sizeof(use));
72         for(i=1;i<=n;i++)
73             for(j=1;j<=m;j++)
74             {
75                 //scanf("%c",&ch);
76                 cin>>ch;
77                 if(ch=='*')
78                 {
79                     map[i][j]=1;
80                 }
81             }
82             build();
83             printf("%d\n",match());
84     }
85     return 0;
86 }

 

posted @ 2012-05-07 20:54  我们一直在努力  阅读(173)  评论(0编辑  收藏  举报