这是一道水题,

这里是最大流解法,之后再补

坑在又忘了反向建边了

题意:给你二维bool数组,让你求出能用多米诺骨牌覆盖所有 1 且骨牌最少的放法(因为多米诺骨牌1*2的结构方便描述,原题没有),原本的数据是字符数组,'*'为1,'o'为0,

思路:仔细看看题会发现是上下左右只能取一个,不是那种十字星形的

取的话只能取一个点或者是两个点,要是把棋盘染色一定只能取一黑一白,总'*'也就是1的数目-黑到白的路数=孤立点+黑到白的边数=总数-最大匹配

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
char maz[62][62];
int e[500][500];
int d[4][2]={0,1,0,-1,1,0,-1,0};
int n,m;
vector <int > G[500];
bool vis[500];
void addedge(int from,int to){
e[from][to]=1;
G[from].push_back(to);
}
int dfs(int s){
vis[s]=true;
if(s==n*m+1){//printf("dfs %d ok\n",s);
return 1;}
for(int i=0;i<G[s].size();i++){
if(!vis[G[s][i]]&&e[s][G[s][i]]&&dfs(G[s][i])){
e[s][G[s][i]]=0;
e[G[s][i]][s]=1;
// printf("dfs %d ok\n",s);
return 1;
}
}
//printf("dfs %d failed \n",s);
return 0;
}
int maxflow(){
int ans=0,f;
while(1){
f=dfs(n*m);
memset(vis,0,sizeof(vis));
if(f==0)break;
ans+=f;
}
return ans;
}
void printe(){
for(int i=0;i<m*n+2;i++){
bool f=false;
for(int j=0;j<m*n+2;j++){
if(e[i][j]){printf("e[%d][%d] ",i,j);f=true;}
}
if(f) printf("\n");
}
}
int main(){
int t;
scanf("%d",&t);
while((t--)&&scanf("%d%d",&n,&m)==2){
for(int i=0;i<=n*n+1;i++){G[i].clear();}
memset(e,0,sizeof(e)); for(int i=0;i<n;i++){
scanf("%s",maz[i]);
}
int ans=0;
int star=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(maz[i][j]=='*'){
star++;
if((i+j)&1){
addedge(n*m,i*m+j);//n*n s n*n+1 t
// printf("addedge %d %d %d %d:%d to %d\n",n,0,i,j,n*m,i*m+j);
for(int k=0;k<4;k++){
int nx=i+d[k][0];
int ny=j+d[k][1];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&maz[nx][ny]=='*'){
addedge(i*m+j,nx*m+ny);
// printf("addedge %d %d %d %d:%d to %d\n",i,j,nx,ny,i*m+j,nx*m+ny);
}
}
}
else {
addedge(i*m+j,n*m+1);
//printf("addedge %d %d %d %d:%d to %d\n",i,j,n,1,i*m+j,n*m+1);
for(int k=0;k<4;k++){
int nx=i+d[k][0];
int ny=j+d[k][1];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&maz[nx][ny]=='*'){
addedge(i*m+j,nx*m+ny);
e[i*m+j][nx*m+ny]=0;
// printf("addedge %d %d %d %d:%d to %d\n",i,j,nx,ny,i*m+j,nx*m+ny);
}
}
}
}
}
} ans=maxflow();
printf("%d\n",star-ans);
}
return 0;
}

poj3020 二分图匹配 最大独立集的更多相关文章

  1. POJ3020 二分图匹配——最小路径覆盖

    Description The Global Aerial Research Centre has been allotted the task of building the fifth gener ...

  2. poj3020二分图匹配

    The Global Aerial Research Centre has been allotted the task of building the fifth generation of mob ...

  3. HDU-1068-GirlsandBoys(最大独立集,二分图匹配)

    链接:https://vjudge.net/problem/HDU-1068#author=0 题意: 学校对n个学生(男女都有)进行的调查了,发现了某些学生暗生情愫,现在需要你选出一个最大的集合,这 ...

  4. POJ3020:Antenna Placement(二分图匹配)

    Antnna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11093   Accepted: 5459 ...

  5. UVALive 3415 Guardian of Decency(二分图的最大独立集)

    题意:老师在选择一些学生做活动时,为避免学生发生暧昧关系,就提出了四个要求.在他眼中,只要任意两个人符合这四个要求之一,就不可能发生暧昧.现在给出n个学生关于这四个要求的信息,求老师可以挑选出的最大学 ...

  6. UVa 二分图匹配 Examples

    这些都是刘汝佳的算法训练指南上的例题,基本包括了常见的几种二分图匹配的算法. 二分图是这样一个图,顶点分成两个不相交的集合X , Y中,其中同一个集合中没有边,所有的边关联在两个集合中. 给定一个二分 ...

  7. 【ACM/ICPC2013】二分图匹配专题

    前言:居然三天没有更新了..我的效率实在太低,每天都用各种各样的理由拖延,太差了!昨天的contest依旧不能让人满意,解出的三题都是队友A的,我又卖了一次萌..好吧废话不多说,今天我要纪录的是二分图 ...

  8. LOJ2276 [HAOI2017] 新型城市化 【二分图匹配】【tarjan】

    题目分析: 这题出的好! 首先问题肯定是二分图的最大独立集,如果删去某条匹配边之后独立集是否会变大. 跑出最大流之后流满的边就是匹配边. 如果一个匹配边的两个端点在一个强连通分量里,那这条边删掉之后我 ...

  9. HAOI2017 新型城市化 二分图的最大独立集+最大流+强连通缩点

    题目链接(洛谷):https://www.luogu.org/problemnew/show/P3731 题意概述:给出一张二分图,询问删掉哪些边之后可以使这张二分图的最大独立集变大.N<=10 ...

随机推荐

  1. stl string 使用(转载)

    出处:http://www.cnblogs.com/lzjsky/archive/2011/01/23/1942508.html 1. 查找字符 std::wstring strData = L&qu ...

  2. Python3基础 map+lambda 将指定系列元素乘2

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. Python3基础 time.localtime 当前系统的年月日 时分秒

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. luogu P4396 [AHOI2013]作业

    目录 题目 思路 错误&&傻叉 代码 题目 luogu 思路 每次都是插入比之前所有数字大的数,所以之前的答案就不会改变 用fhq-treap求出原序列,然后用树状数组依次算出每个值得 ...

  5. 【修改帐号信息】Eclipse中修改SVN用户名和密码方法

    由于在svn 的界面中并没有为我们提供直接更换用户名密码的地方,所以一旦我们需要更换用户名的就需要自己想一些办法. 解决方案: 在Eclipse 使用SVN 的过程中大多数人往往习惯把访问SVN 的用 ...

  6. 51NOD 1081 子段求和

    1081 子段求和   给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和.   例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} ...

  7. 论文笔记——Deep Model Compression Distilling Knowledge from Noisy Teachers

    论文地址:https://arxiv.org/abs/1610.09650 主要思想 这篇文章就是用teacher-student模型,用一个teacher模型来训练一个student模型,同时对te ...

  8. 2017年P4中国峰会北京站 会议小结

    2017 P4 中国峰会 北京 本次会议依然侧重介绍P4,并highlight P4的benifit,大致分为以下几类: 1.学术界 - 未来网络的发展,为何提出P4技术? 未来网络和实体经济.其他学 ...

  9. UVa 1354 天平难题

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. Web API过滤器

    Web API包含在操作方法执行之前或之后添加额外的逻辑的过滤器.过滤器可用于提供横切特性,比如日志记录.异常处理.性能测量.身份验证和授权等等. 过滤器可以应用于Web API控制器或一个或多个操作 ...