博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2226 Muddy Fields 二分匹配 最小顶点覆盖 好题
阅读量:5113 次
发布时间:2019-06-13

本文共 2027 字,大约阅读时间需要 6 分钟。

在一个n*m的草地上,.代表草地,*代表水,现在要用宽度为1,长度不限的木板盖住水,

木板可以重叠,但是所有的草地都不能被木板覆盖。

问至少需要的木板数。

 

这类题的建图方法:

把矩阵作为一个二分图,以行列分别作为2个顶点集

首先以每一行来看,把这一行里面连续的*编号,作为一个顶点

再以每一列来看,把这一列里面连续的*编号,作为一个顶点

则每一个*都有2个编号,以行看时有一个,以列看时有一个,则把这2个编号连边,容量为1

再建一个源点,连接所有行的编号,一个汇点,连接所有列的编号

 

这道题要求的是,所有*都被覆盖,即找到一个顶点的集合S,使得任意边都有至少一个顶点属于

S,即求一个点集顶点覆盖S,又要木板数最少,所以求的就是最小顶点覆盖。

 

最小顶点覆盖怎么求?

二分图中,有:

最小顶点覆盖=最大匹配

 

所以这道题就转化为求二分图的最大匹配了

再转化为最大流dinic算法。

 

 

 

1 #include
2 #include
3 #include
4 #include
5 6 using namespace std; 7 8 const int maxn=2510; 9 const int inf=0x3f3f3f3f; 10 const int s=0; 11 int t; 12 int tota; 13 int totb; 14 15 inline int min(int x,int y) 16 { 17 return x
edge[maxn]; 25 int iter[maxn]; 26 int level[maxn]; 27 char str[55][55]; 28 int hash[55][55]; 29 30 void addedge(int from,int to,int cap) 31 { 32 edge[from].push_back((Edge){to,cap,edge[to].size()}); 33 edge[to].push_back((Edge){
from,0,edge[from].size()-1}); 34 } 35 36 void build_graph(int n,int m) 37 { 38 for(int i=0;i
que; 89 while(!que.empty()) 90 que.pop(); 91 que.push(s); 92 level[s]=1; 93 while(!que.empty()) 94 { 95 int u=que.front(); 96 que.pop(); 97 for(int i=0;i
0&&level[e.to]<0)101 {102 level[e.to]=level[u]+1;103 que.push(e.to);104 }105 }106 }107 }108 109 int dfs(int u,int f)110 {111 if(u==t)112 return f;113 for(int &i=iter[u];i
0&&level[e.to]>level[u])117 {118 int d=dfs(e.to,min(f,e.cap));119 if(d>0)120 {121 e.cap-=d;122 edge[e.to][e.rev].cap+=d;123 return d;124 }125 126 }127 }128 return 0;129 }130 131 int solve()132 {133 int flow=0;134 while(true)135 {136 bfs();137 if(level[t]<0)138 return flow;139 memset(iter,0,sizeof iter);140 int f;141 while(f=dfs(s,inf))142 {143 flow+=f;144 }145 }146 }147 148 int main()149 {150 int n,m;151 while(~scanf("%d%d",&n,&m))152 {153 for(int i=1;i<=n;i++)154 {155 scanf("%s",str[i]+1);156 }157 build_graph(n,m);158 printf("%d\n",solve());159 }160 return 0;161 }
View Code

 

转载于:https://www.cnblogs.com/-maybe/p/4716460.html

你可能感兴趣的文章
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
python常用函数
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
[HDU3683 Gomoku]
查看>>
【工具相关】iOS-Reveal的使用
查看>>
数据库3
查看>>
存储分类
查看>>
下一代操作系统与软件
查看>>
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>
DataGridView的行的字体颜色变化
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>