poj 2226 二分图 最小点覆盖 , 最大流
题目就是问怎样用最小的板覆盖全部的草地。能够横着放。也能够竖着放,同意一个草地放多个点。
建图方法就是 每一个横向的草地作为X,纵向连续的草地作为Y. X连接Y的边表示, 这里有他们的公共点。。
非常显然,覆盖全部草地,就是覆盖全部的边 ,二分图中。最小点覆盖 = 最大匹配
= =事实上假设存在一条边未被选中的节点覆盖,则必定存在一条相应的增广路径
//tpl
//ipqhjjybj_tpl.h
//header.h
#include <cstdio>
#include <cstdlib>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <string> #define mp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define pLL pair<long long ,long long>
#define rep(i,j,k) for(int i = j; i < k;i++) using namespace std; const int INF = 0x3f3f3f3f; const int N = 500;
int g[N][N];
int cx[N],cy[N];
int mark[N];
int nx,ny; int dfs(int u)
{
rep(v,0,ny)
{
if(g[u][v]&&!mark[v])//u和v不要搞反了
{
mark[v]=1;
if(cy[v]==-1||dfs(cy[v]))
{
cx[u]=v;
cy[v]=u;
return 1;
}
}
}
return 0;
}
int maxmatch()
{
int res=0;
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
rep(i,0,nx)
{
if(cx[i]==-1)
{
memset(mark,0,sizeof(mark));
res+=dfs(i);
}
}
// rep(i,0,nx){
// printf("cx[%d] = %d\n",i,cx[i]);
// printf("cy[%d] = %d\n",i,cy[i]);
// }
return res;
} int a[N][N],b[N][N];
char s[N][N];
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
memset(g,0,sizeof(g));
rep(i,0,n) scanf("%s",s[i]);
int cnt = 0;
rep(i,0,n)
rep(j,0,m){
if(s[i][j]=='*'){
if(i==0 || s[i-1][j]=='.')
a[i][j] = cnt++;
else a[i][j] = a[i-1][j];
}
}
nx = cnt;
cnt = 0;
rep(i,0,n)
rep(j,0,m){
if(s[i][j] == '*'){
if(j==0 || s[i][j-1]=='.')
b[i][j] = cnt++;
else b[i][j] = b[i][j-1];
g[a[i][j]][b[i][j]] = 1;
}
}
ny = cnt;
// rep(i,0,nx){
// rep(j,0,ny)
// printf("g[%d][%d]=%d ",i,j,g[i][j]);
// printf("\n");
// } printf("%d\n",maxmatch());
}
return 0;
}
附上我的 最大流写法。
。
//tpl
//ipqhjjybj_tpl.h
//header.h
#include <cstdio>
#include <cstdlib>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <string> #define mp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define pLL pair<long long ,long long>
#define rep(i,j,k) for(int i = j; i < k;i++) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1111;
int tot;
int s,t;
int sum;
struct node{
int u,v,w,next;
node(){}
node(int _u,int _v,int _w,int _next){
u=_u,v=_v,w=_w,next=_next;
}
}edge[N*N];
int head[N],cur[N],dis[N];
int pre[N],gap[N],aug[N];
const int oo=0x3f3f3f;
void addEdge(int u,int v,int w){
edge[tot]=node(u,v,w,head[u]);
head[u]=tot++;
edge[tot]=node(v,u,0,head[v]);
head[v]=tot++;
} int SAP(int s,int e,int n){
int max_flow=0,v,u=s;
int id,mindis;
aug[s]=oo;
pre[s]=-1;
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
gap[0]=n; for(int i=0;i <= n;i++)
cur[i]=head[i]; while(dis[s]<n){
if(u==e){
max_flow += aug[e];
for(v=pre[e]; v!=-1; v=pre[v]){
int ed=cur[v];
edge[ed].w -= aug[e];
edge[ed^1].w += aug[e];
aug[v]-=aug[e];
if(edge[ed].w==0) u=v;
}
}
bool flag=false;
for(id=cur[u]; id!=-1;id=edge[id].next){
v=edge[id].v;
if(edge[id].w > 0 && dis[u]==dis[v]+1){
flag=true;
pre[v]=u;
cur[u]=id;
aug[v]=min(aug[u],edge[id].w);
u=v;
break;
}
}
if(flag==false){
if(--gap[dis[u]] == 0) break;
int mindis=n;
for(id=head[u]; id!=-1; id=edge[id].next){
v=edge[id].v;
if(edge[id].w>0 && dis[v] < mindis){
mindis = dis[v];
cur[u]=id;
}
}
dis[u] = mindis + 1;
gap[dis[u]]++;
if(u!=s)u=pre[u];
}
}
return max_flow;
} int a[N][N],b[N][N];
char ss[N][N];
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
tot=sum=s=0;
int tc=0;
memset(head,-1,sizeof(head)); rep(i,0,n) scanf("%s",ss[i]);
int cnt = 0;
t = ++cnt;
rep(i,0,n)
rep(j,0,m){
if(ss[i][j]=='*'){
if(i==0 || ss[i-1][j]=='.')
a[i][j] = ++cnt , addEdge(s,a[i][j],1);
else a[i][j] = a[i-1][j];
}
} rep(i,0,n)
rep(j,0,m){
if(ss[i][j] == '*'){ if(j==0 || ss[i][j-1]=='.')
b[i][j] = ++cnt ,addEdge(b[i][j],t,1);
else b[i][j] = b[i][j-1];
//g[a[i][j]][b[i][j]] = 1;
addEdge(a[i][j],b[i][j],1); }
} printf("%d\n",SAP(s,t,cnt+1));
}
return 0;
}
poj 2226 二分图 最小点覆盖 , 最大流的更多相关文章
- Asteroids POJ - 3041 二分图最小点覆盖
Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...
- [POJ] 2226 Muddy Fields(二分图最小点覆盖)
题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个&q ...
- 二分图 最小点覆盖 poj 3041
题目链接:Asteroids - POJ 3041 - Virtual Judge https://vjudge.net/problem/POJ-3041 第一行输入一个n和一个m表示在n*n的网格 ...
- 二分图最小点覆盖构造方案+König定理证明
前言 博主很笨 ,如有纰漏,欢迎在评论区指出讨论. 二分图的最大匹配使用 \(Dinic\) 算法进行实现,时间复杂度为 \(O(n\sqrt{e})\),其中, \(n\)为二分图中左部点的数量, ...
- POJ2226 Muddy Fields(二分图最小点覆盖集)
题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作 ...
- POJ1325 Machine Schedule(二分图最小点覆盖集)
最小点覆盖集就是在一个有向图中选出最少的点集,使其覆盖所有的边. 二分图最小点覆盖集=二分图最大匹配(二分图最大边独立集) 这题A机器的n种模式作为X部的点,B机器的m种模式作为Y部的点: 每个任务就 ...
- hihoCoder #1127:二分图最小点覆盖和最大独立集
题目大意:求二分图最小点覆盖和最大独立集. 题目分析:如果选中一个点,那么与这个点相连的所有边都被覆盖,使所有边都被覆盖的最小点集称为最小点覆盖,它等于最大匹配:任意两个点之间都没有边相连的最大点集称 ...
- POJ 3041 Asteroids (最小点覆盖集)
题意 给出一个N*N的矩阵,有些格子上有障碍,要求每次消除一行或者一列的障碍,最少消除多少次可以全部清除障碍. 思路 把关键点取出来:一个障碍至少需要被它的行或者列中的一个消除. 也许是最近在做二分图 ...
- HihoCoder1127 二分图三·二分图最小点覆盖和最大独立集
二分图三·二分图最小点覆盖和最大独立集 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了.不过相亲这个事不是说 ...
随机推荐
- linux下面mmap和setsignal函数用法
#include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <fcntl.h& ...
- MVC扩展Filter,通过继承ActionFilterAttribute为登录密码加密
与ActionFilter相关的接口有2个: □ IActionFilter 对action执行前后处理 void OnActionExecuting(ActionExecutingContext f ...
- Spring MVC的异步模式DefferedResult
原文:http://www.importnew.com/21051.html 什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: (图1) 浏览器发起请求,Web服 ...
- error: 'release' is unavailable: not available in automatic reference counting,该怎么解决
编译出现错误: 'release' is unavailable: not available in automatic reference counting mode.. 解决办法: You nee ...
- OBjective-C:文件管理类NSFileManager
文件管理类NSFileManager类:对文件进行创建.复制.重命名.删除等,一般不对文件内容进行操作. NSData类和NSMutableData类:相当于数据缓冲区 NSFileManager是 ...
- 我所遭遇过的游戏中间件---HumanIK
我所遭遇过的游戏中间件---HumanIK Autodesk HumanIK游戏中间件,为游戏创建更加可信.真实的角色动画.该中间件的全身逆向运动(FBIK)系统支持角色真实地与所在环境及其它角色进行 ...
- 第二章 Jackson属性名转换+属性忽略
@Data @JsonIgnoreProperties(ignoreUnknown = true) public class MyRecord { private boolean succeed; p ...
- 用C语言获取任意文件的长度(可能大于2GB)
用C语言获取文件长度的常见思路是: 打开文件后用 fseek() 函数把文件位置指针移动到文件的末尾,用 ftell() 获得这时位置指针距文件头的字节数,这个字节数就是文件的长度.但是这样做也会受到 ...
- [Javascript] Prototype 1
You can add prototype to any object in Jacascript likes Object, Array, String... prototype 有继承的作用,比如 ...
- linux环境中设置jacoco覆盖率
cd /alidata1/admin/za-themis pkill -9 -f za-themis #CATALINA_HOME=/root/za-tomcat #CATALINA_BASE=/ro ...