POJ-2226 Muddy Fields 最小点集覆盖
2012-11-19 09:56
375 查看
题目链接:http://poj.org/problem?id=2226
这题是POJ 3041的升级版本,很有意思,要求木板不能盖在草地上。那么这里我们可以把每行一连续‘*’的看做行,把每列连续的‘*’看做列,那么在建模就是POJ 3041的原题了。
看一个例子:
3 3 X集合 Y集合
.*. 010 020
*** ———> 222 123
.*. 033 020
那么再根据X,Y集合连边即可。
要覆盖图中所有的点,即二分图中的边,那么就是最小点集覆盖了。
这题是POJ 3041的升级版本,很有意思,要求木板不能盖在草地上。那么这里我们可以把每行一连续‘*’的看做行,把每列连续的‘*’看做列,那么在建模就是POJ 3041的原题了。
看一个例子:
3 3 X集合 Y集合
.*. 010 020
*** ———> 222 123
.*. 033 020
那么再根据X,Y集合连边即可。
要覆盖图中所有的点,即二分图中的边,那么就是最小点集覆盖了。
//STATUS:G++_AC_16MS_1760KB #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<iostream> #include<string> #include<algorithm> #include<vector> #include<queue> #include<stack> using namespace std; #define LL long long #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const int MAX=60,INF=200000000; char map[MAX][MAX]; int g[510][510],vis[510],y[510],grax[MAX][MAX],gray[MAX][MAX]; int n,m,cou; void getg() { mem(grax,0); mem(gray,0); int i,j,k; for(k=i=0;i<n;i++){ for(j=0;j<m;j++){ if(map[i][j]=='*'){ k++; for(;map[i][j]=='*';j++) grax[i][j]=k; } } } cou=Max(cou,k); for(k=j=0;j<m;j++){ for(i=0;i<n;i++){ if(map[i][j]=='*'){ k++; for(;map[i][j]=='*';i++) gray[i][j]=k; } } } cou=Max(cou,k); for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(grax[i][j] && gray[i][j]) g[grax[i][j]][gray[i][j]]=1; } } } int dfs(int u) { int v; for(v=1;v<=cou;v++){ if(g[u][v] && !vis[v]){ vis[v]=1; if(!y[v] || dfs(y[v])){ y[v]=u; return 1; } } } return 0; } int main() { // freopen("in.txt","r",stdin); int i,j,ans; while(~scanf("%d%d",&n,&m)) { ans=cou=0; mem(y,0); mem(g,0); for(i=0;i<n;i++){ scanf("%s",map[i]); } getg(); for(i=1;i<=cou;i++){ mem(vis,0); if(dfs(i))ans++; } printf("%d\n",ans); } }
相关文章推荐
- poj 2226 Muddy Fields(最小点集覆盖)
- poj 2226 二分图最小点集覆盖
- POJ 2226 Muddy Fields 匈牙利算法/最小点覆盖
- poj 2226 Muddy Fields(二分图——最小点覆盖)
- poj 2226 Muddy Fields(最小点覆盖+巧妙构图)
- poj 2226 Muddy Fields (转化成二分图的最小覆盖)
- poj 2226 Muddy Fields 最小点覆盖
- poj 2226 Muddy Fields 最小顶点覆盖
- POJ 2226 Muddy Fields(最小顶点覆盖)
- POJ 2226 Muddy Fields(最小点覆盖)
- POJ 2226 Muddy Fields【二分图最小点覆盖】
- POJ 2226 Muddy Fields (最小点覆盖)
- POJ 2226 Muddy Fields(匈牙利算法—最小点覆盖)
- POJ 题目2226 Muddy Fields(最小点覆盖)
- [POJ] 2226 Muddy Fields(二分图最小点覆盖)
- poj 2226 Muddy Fields(最小点覆盖)
- POJ 2226 Muddy Fields(最小点覆盖)
- POJ-2226-Muddy Fields-二分图-最小点覆盖
- POJ - 2226 Muddy Fields 二分图 最小点覆盖
- poj 2226 Muddy Fields(二分图最小点覆盖)