hdu4185+poj3020(最大匹配+最小边覆盖)
题意:n*n的方格里有字符*和#,只能在字符#上放1*2的板子且不能相交,求最多能放多少个。
分析:直接给#字符编号,然后相邻的可以匹配,建边后无向图跑匈牙利算法,最后得到的最大匹配数/2。
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 610
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
int match[N],vis[N],n,m,cnt;
int g[N][N],mat[N][N];
char s[N][N];
int dfs(int u)
{
for(int i=;i<=cnt;i++)
{
if(!vis[i]&&g[u][i])
{
vis[i]=;
if(match[i]==-||dfs(match[i]))
{
match[i]=u;
return ;
}
}
}
return ;
}
int hungary()
{
memset(match,-,sizeof(match));
int ans=;
for(int i=;i<=cnt;i++)
{
memset(vis,,sizeof(vis));
if(dfs(i))ans++;
}
return ans;
}
void judge(int i,int j)
{
if(j+<=n&&mat[i][j+])
g[mat[i][j]][mat[i][j+]]=g[mat[i][j+]][mat[i][j]]=;
if(i+<=n&&mat[i+][j])
g[mat[i][j]][mat[i+][j]]=g[mat[i+][j]][mat[i][j]]=;
}
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%s",s[i]+);
cnt=;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
if(s[i][j]=='#')
mat[i][j]=++cnt;
else mat[i][j]=;
}
FILL(g,);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(mat[i][j])judge(i,j);
int res=hungary();
printf("Case %d: %d\n",cas++,res/);
}
}
传送门:poj 3020 Antenna Placement
题意:n*m的方格里有字符*和o,相邻的两个字符*可以连接,求覆盖完所有的*最少需要多少边。
分析:最少边覆盖所有点,就是最少边覆盖,最少边覆盖=总结点-最大匹配(双向图)/2。
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 410
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
int match[N],vis[N],n,m,cnt;
int g[N][N],mat[N][N];
char s[N][N];
int dfs(int u)
{
for(int i=;i<=cnt;i++)
{
if(!vis[i]&&g[u][i])
{
vis[i]=;
if(match[i]==-||dfs(match[i]))
{
match[i]=u;
return ;
}
}
}
return ;
}
int hungary()
{
memset(match,-,sizeof(match));
int ans=;
for(int i=;i<=cnt;i++)
{
memset(vis,,sizeof(vis));
if(dfs(i))ans++;
}
return ans;
}
void judge(int i,int j)
{
if(j+<=m&&mat[i][j+])
g[mat[i][j]][mat[i][j+]]=g[mat[i][j+]][mat[i][j]]=;
if(i+<=n&&mat[i+][j])
g[mat[i][j]][mat[i+][j]]=g[mat[i+][j]][mat[i][j]]=;
}
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%s",s[i]+);
cnt=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
if(s[i][j]=='*')
mat[i][j]=++cnt;
else mat[i][j]=;
}
FILL(g,);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mat[i][j])judge(i,j);
int res=hungary();
printf("%d\n",cnt-res/);
}
}
hdu4185+poj3020(最大匹配+最小边覆盖)的更多相关文章
- POJ3020 Antenna Placement —— 最大匹配 or 最小边覆盖
题目链接:https://vjudge.net/problem/POJ-3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K ...
- 二分图之最小边覆盖(poj3020)
题目:poj3020 题意:给出一个图,让你用最少的1*2的纸片覆盖掉图中的全部*出现过的地方. 基本裸的最小边覆盖. 分析: 最小边覆盖 = 点总数 - 最大匹配 所以就是转化为求最大匹配. 跟前面 ...
- POJ3020(最小边覆盖)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8924 Accepted: 4428 ...
- PKU 3020 Antenna Placement(拆点+最小边覆盖)(最大匹配)
题目大意:原题链接 一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使得所有的城市都覆盖无线? 提示:看清楚题目,' ...
- J - Air Raid - hdu 1151(最小边覆盖)
题意:给一个有向无环图,求出来最少需要几个士兵可以遍历所有的边. 分析:有向无环图的最小边覆盖 = 点数 - 最大匹配数 为什么是这样的公式??可以思考一下,如果这N个点之间没有边,是不是应该有N个士 ...
- [置顶] 白话最小边覆盖总结--附加 hdu1151结题报告
刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配... 去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集 ...
- HDU1151:Air Raid(最小边覆盖)
Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- Poj 2594 Treasure Exploration (最小边覆盖+传递闭包)
题目链接: Poj 2594 Treasure Exploration 题目描述: 在外星上有n个点需要机器人去探险,有m条单向路径.问至少需要几个机器人才能遍历完所有的点,一个点可以被多个机器人经过 ...
- poj 3041 Asteroids (最大匹配最小顶点覆盖——匈牙利模板题)
http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
随机推荐
- java基础之& 和 && 的差别
&和&&都能够用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,仅仅要有一方为false,则结果为false. ...
- ASP.NET - 匹配标签中的内容
string str = @"<td>Csdn</td>\r\n<td>V1.0</td>\r\n<td>2014-10-23&l ...
- EasyUI - According 分类列表
效果: html代码: <div id="aa" class="easyui-accordion" style="width: 300px; h ...
- ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法
题目连接:problemId=542" target="_blank">ZOJ 1542 POJ 1861 Network 网络 Network Time Limi ...
- 查找后去掉EditTextView的焦点
//在按钮点击事件里处理 bt_search.setOnClickListener(new OnClickListener() { public void onClick(View v) { ...
- 慎用MonthsBetweent和MonthSpan
●function MonthsBetween(const ANow, AThen: TDateTime): Integer; 描述: 根据两个给定的TDateTime类型的参数ANow和AThen, ...
- 基于visual Studio2013解决面试题之0401非递归遍历二叉树
题目
- Node-Webkit作者王文睿:桌面应用的全新开发方式
摘要:最近两年,Node.js技术越来越火,基于它所开发的应用也纷纷出现在大家面前,其中Node-Webkit就是这样的一个开源框架,它允许开发者使用Web技术开发桌面应用. Node-Webkit是 ...
- CodeForces 21C Stripe 2 构造题
题目链接: 题目链接:点击打开链接 #include <cstdio> #include <cstring> #include <algorithm> #inclu ...
- 怎样使用jsp实现header和footer与网页内容的分离
好多显示层框架都自带这样的功能JSF,Wicket,页面布局取决于项目使用的显示层框架. 前台即客户端的布局,通常用在无需跳转的页面.比如同样是用户管理页面,增删改查的操作都希望停留在同一个页面.这时 ...