poj3020 二分图匹配 最大独立集
这是一道水题,
这里是最大流解法,之后再补
坑在又忘了反向建边了
题意:给你二维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 二分图匹配 最大独立集的更多相关文章
- POJ3020 二分图匹配——最小路径覆盖
Description The Global Aerial Research Centre has been allotted the task of building the fifth gener ...
- poj3020二分图匹配
The Global Aerial Research Centre has been allotted the task of building the fifth generation of mob ...
- HDU-1068-GirlsandBoys(最大独立集,二分图匹配)
链接:https://vjudge.net/problem/HDU-1068#author=0 题意: 学校对n个学生(男女都有)进行的调查了,发现了某些学生暗生情愫,现在需要你选出一个最大的集合,这 ...
- POJ3020:Antenna Placement(二分图匹配)
Antnna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11093 Accepted: 5459 ...
- UVALive 3415 Guardian of Decency(二分图的最大独立集)
题意:老师在选择一些学生做活动时,为避免学生发生暧昧关系,就提出了四个要求.在他眼中,只要任意两个人符合这四个要求之一,就不可能发生暧昧.现在给出n个学生关于这四个要求的信息,求老师可以挑选出的最大学 ...
- UVa 二分图匹配 Examples
这些都是刘汝佳的算法训练指南上的例题,基本包括了常见的几种二分图匹配的算法. 二分图是这样一个图,顶点分成两个不相交的集合X , Y中,其中同一个集合中没有边,所有的边关联在两个集合中. 给定一个二分 ...
- 【ACM/ICPC2013】二分图匹配专题
前言:居然三天没有更新了..我的效率实在太低,每天都用各种各样的理由拖延,太差了!昨天的contest依旧不能让人满意,解出的三题都是队友A的,我又卖了一次萌..好吧废话不多说,今天我要纪录的是二分图 ...
- LOJ2276 [HAOI2017] 新型城市化 【二分图匹配】【tarjan】
题目分析: 这题出的好! 首先问题肯定是二分图的最大独立集,如果删去某条匹配边之后独立集是否会变大. 跑出最大流之后流满的边就是匹配边. 如果一个匹配边的两个端点在一个强连通分量里,那这条边删掉之后我 ...
- HAOI2017 新型城市化 二分图的最大独立集+最大流+强连通缩点
题目链接(洛谷):https://www.luogu.org/problemnew/show/P3731 题意概述:给出一张二分图,询问删掉哪些边之后可以使这张二分图的最大独立集变大.N<=10 ...
随机推荐
- Duilib 实现开关按钮
转载:http://blog.csdn.net/wuan584974722/article/details/25045737 我们在做MFC程序时候经常会一个切换式的按钮,之前我的做法是利用butti ...
- xshell的Solarized Dark配色方案
之前在ubuntu, kali, mint, air下都使用这一款配色方案,后来在网上看到有人在xshell中使用,配色方案有分享,就是一起无法导入 原来这个东西在你现有的连接无法直接导入,需要重新打 ...
- UVA796 Critical Links(求桥) 题解
题意:求桥 思路:求桥的条件是:(u,v)是父子边时 low[v]>dfn[u] 所以我们要解决的问题是怎么判断u,v是父子边(也叫树枝边).我们在进行dfs的时候,要加入一个fa表示当前进行搜 ...
- Is it bad to rely on foreign key cascading? 外键 级联操作
Is it bad to rely on foreign key cascading? I'll preface前言 this by saying that I rarely delete rows ...
- 使用CLR Profiler查看C#运行程序的内存占用情况
http://blog.csdn.net/wy3552128/article/details/8158938 https://msdn.microsoft.com/en-us/library/ff65 ...
- 【第二十九章】 springboot + zipkin + mysql
zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...
- junit中test注解测试使用案列解析二
本文原创,转载请注明出处 在上文中,已经简单的解析了junit中test注解的使用方法,今天在进行test测试时,遇到了一个异常,于是想深 入的研究一下. 还原一下今天的异常代码: @Service ...
- python字典按照value进行排序.bak
先说几个解决的方法,具体的有时间再细说 d = {'a':1,'b':4,'c':2} 字典是这个,然后要对字典按照value进行排序 方法一: sorted(d.items(),key = lamb ...
- BN层
论文名字:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 论 ...
- 更新自带pip
想安装docker-compose发现居然找不到pip curl https://bootstrap.pypa.io/get-pip.py | python 直接sudo不行.还是提示权限不够. su ...