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 描述 在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了.不过相亲这个事不是说 ...
 
随机推荐
- LeetCode152:Maximum Product Subarray
			
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
 - svn如何提取文件更新列表
			
eclipse svn插件site-1.10.1 Slik-Subversion-1.8.0-x64.msi ---可以使用svn命令,如svn status 显示修改过的本地文件,如下示例: I: ...
 - BMP文件格式实例分析
			
1. 以下为一个RGB565-16位BMP位图实际的部分数据: 00000000h: 42 4D 46 58 02 00 00 00 00 00 46 00 00 00 28 00 ; BMFX... ...
 - CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
			
CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...
 - MVC借助MvcSiteMapProvider实现站点地图
			
使用MvcSiteMapProvider可轻松实现站点地图,俗称"面包屑".如图: 通过NuGet,输入MvcSiteMapProvider搜索,并安装. 在Mvc.sitemap ...
 - java string常见操作题
			
1. 每个基本类型封装类都有将string转换为基本数据类型的方法 对于非常大的数字请使用Long,代码如下 int age = Integer.parseInt("10"); ...
 - xml转换成map
			
import java.io.IOException;import java.io.StringReader;import java.util.ArrayList;import java.util.H ...
 - quartz终止正在运行的任务
			
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.UR ...
 - Vmware esx/esxi Vlan三种配置模式(VST、EST和VGT)
			
在Vmware esx/esxi中使用虚拟Lan(Vlan)时,一般是指Vlan Trunk的使用,使用的Vlan配置还有其它三种类型: Virtual Switch Tagging(虚拟交换机标记, ...
 - Android Binder 设计与实现 - 设计篇
			
关键词 Binder Android IPC Linux 内核 驱动 摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket ...