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 ...
随机推荐
- 字符串分割(C++)(转载)
转载出自:http://www.cnblogs.com/MikeZhang/archive/2012/03/24/MySplitFunCPP.html 经常碰到字符串分割的问题,这里总结下,也方便我以 ...
- python循环和布尔表达式总结
1.Python的for循环是循环遍历序列的有限循环. 2.Python的while语句是一个不定循环的例子.只要循环条件保持为真,它就继续迭代.使用不定循环时,程序员必须注意,以免不小心写成无限循环 ...
- Delphi XE5 for Android (五)
Android程序开发必然用到按钮,在XE5下,按钮的一个比较重要的属性就是StyleLookup,预置了一系列常用的图标,如下图: 另外2个常用属性就是: GroupName和IsPressed:一 ...
- Django组件(三) Django之中间件
中间件概述 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性 ...
- Java基础部分二
1.&与&& &位运算符,&&逻辑与运算符&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式 2.switch ...
- 分布式系统一致性算法Raft
Raft 算法也是一种少数服从多数的算法,在任何时候一个服务器可以扮演以下角色之一:Leader:负责 Client 交互 和 log 复制,同一时刻系统中最多存在一个Follower:被动响应请求 ...
- SPOJ - POLYNOM Polynomial(数论乱搞)题解
题意 :给你n个数,问你是否存在一个多项式(最多三次方)满足f(i)= xi. 思路:讲一个神奇的思路: x3 - (x - 1)3 = 3x2 - 3x + 1 x2 - (x - 1)2 = 2x ...
- HDU1251 统计难题 (字典树模板)题解
思路:模板题,贴个模板 代码: #include<cstdio> #include<cstring> #include<cstdlib> #include<q ...
- java代码实现highchart与数据库数据结合完整案例分析(二)---折线图
作者原创:未经博主允许不许转载 在上一篇的博客中,展示和分析了如何做一个饼状图,有疑问可以参考上一篇博客. 现在分析和展示折线图的绘制和案例分析, 先展示效果图: 与饼状图不同的是,折线图展现更多的数 ...
- UVa 437 巴比伦塔
https://vjudge.net/problem/UVA-437 这道题和HDU的Monkey and Banana完全一样. #include<iostream> #include& ...