题目链接:
这题是的升级版本,很有意思,要求木板不能盖在草地上。那么这里我们可以把每行一连续‘*’的看做行,把每列连续的‘*’看做列,那么在建模就是的原题了。
看一个例子:
3 3 X集合 Y集合
.*. 010 020
*** ———> 222 123
.*. 033 020
那么再根据X,Y集合连边即可。
要覆盖图中所有的点,即二分图中的边,那么就是最小点集覆盖了。
1 //STATUS:G++_AC_16MS_1760KB 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 using namespace std;13 #define LL long long14 #define Max(a,b) ((a)>(b)?(a):(b))15 #define Min(a,b) ((a)<(b)?(a):(b))16 #define mem(a,b) memset(a,b,sizeof(a))17 #define lson l,mid,rt<<118 #define rson mid+1,r,rt<<1|119 const int MAX=60,INF=200000000;20 21 char map[MAX][MAX];22 int g[510][510],vis[510],y[510],grax[MAX][MAX],gray[MAX][MAX];23 int n,m,cou;24 25 void getg()26 {27 mem(grax,0);28 mem(gray,0);29 int i,j,k;30 for(k=i=0;i