POJ 3041&&3020
两道二分图的练手题。
3041:题意大概是在一个N*N的图上有K个东西,你每次可以清除一行或一列上的所有东西。让你求最少的操作次数。
我们根据题意建图。对于每一个点的坐标(x,y)之间连一条边。比如样例:
由于每条边代表着一个点,因此我们只需要找出最少的点来联结所有的边,也就是最小顶点覆盖=最大匹配
CODE
#include<cstdio>
#include<cstring>
using namespace std;
const int K=;
struct data
{
int to,next;
}e[K];
int head[K],from[K],n,m,x,y,k,i,ans;
bool vis[K];
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
inline void add(int x,int y)
{
e[++k].to=y; e[k].next=head[x]; head[x]=k;
}
inline bool find(int now)
{
for (int i=head[now];i!=-;i=e[i].next)
if (!vis[e[i].to])
{
vis[e[i].to]=;
if (!from[e[i].to]||find(from[e[i].to]))
{
from[e[i].to]=now;
return ;
}
}
return ;
}
int main()
{
memset(e,-,sizeof(e));
memset(head,-,sizeof(head));
read(n); read(m);
for (i=;i<=m;++i)
{
read(x); read(y);
add(x,y+n);
}
for (i=;i<=n;++i)
{
memset(vis,,sizeof(vis));
ans+=find(i);
}
printf("%d",ans);
return ;
}
3020:题意是在一个h*w的图上,每次可以找相邻的(即上下左右四个方向)两个城市(在图中为‘*’),不能重复地建一个信号基站。问最少的建立个数是多少。
同理,我们可以找出城市,在相邻的两点之间连边。由于只有两点间能连边,所以这是一个二分图。
然后要求覆盖所有的城市,就可以转化成最小边覆盖=节点个数-最大匹配/2(因为建的是无向图)
CODE
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=,M=,fx[]={,,,-},fy[]={,,-,};
struct data
{
int to,next;
}e[N*M*];
int head[N*M],from[N*M],a[N][M],n,m,t,i,j,p,k,tot,ans;
bool vis[N*M];
char ch;
inline void add(int x,int y)
{
e[++k].to=y; e[k].next=head[x]; head[x]=k;
}
inline bool find(int now)
{
for (int i=head[now];i!=-;i=e[i].next)
if (!vis[e[i].to])
{
vis[e[i].to]=;
if (!from[e[i].to]||find(from[e[i].to]))
{
from[e[i].to]=now;
return ;
}
}
return ;
}
int main()
{
scanf("%d",&t);
while (t--)
{
memset(e,-,sizeof(e));
memset(head,-,sizeof(head));
memset(a,,sizeof(a));
memset(from,,sizeof(from));
scanf("%d%d",&n,&m);
ans=tot=k=;
for (i=;i<=n;++i)
for (j=;j<=m;++j)
{
cin>>ch;
if (ch=='*') a[i][j]=++tot;
}
for (i=;i<=n;++i)
for (j=;j<=m;++j)
for (p=;p<;++p)
{
int x=i+fx[p],y=j+fy[p];
if (x>&&y>&&x<=n&&y<=m)
if (a[x][y]) add(a[i][j],a[x][y]);
}
for (i=;i<=tot;++i)
{
memset(vis,,sizeof(vis));
ans+=find(i);
}
printf("%d\n",tot-ans/);
}
return ;
}
POJ 3041&&3020的更多相关文章
- POJ 2226 Muddy Fields (最小点覆盖集,对比POJ 3041)
题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障 ...
- POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配)
POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配) Description Bessie wants to navigate her spa ...
- 二分图 最小点覆盖 poj 3041
题目链接:Asteroids - POJ 3041 - Virtual Judge https://vjudge.net/problem/POJ-3041 第一行输入一个n和一个m表示在n*n的网格 ...
- POJ 3041 Asteroids (对偶性,二分图匹配)
题目:POJ 3041 Asteroids http://poj.org/problem?id=3041 分析: 把位置下标看出一条边,这显然是一个二分图最小顶点覆盖的问题,Hungary就好. 挑战 ...
- poj 3041——Asteroids
poj 3041——Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22604 Accep ...
- 二分图最大匹配(匈牙利算法) POJ 3041 Asteroids
题目传送门 /* 题意:每次能消灭一行或一列的障碍物,要求最少的次数. 匈牙利算法:把行和列看做两个集合,当有障碍物连接时连一条边,问题转换为最小点覆盖数==二分图最大匹配数 趣味入门:http:// ...
- Asteroids POJ - 3041 二分图最小点覆盖
Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...
- Asteroids POJ - 3041
Asteroids POJ - 3041 题目大意:N*N的地图里,存在一些小行星,Bessie有个很牛x但又很耗蓝的武器,一次可以消灭一行或者一列的所有小行星,问最少使用多少次这个武器可以消灭所有的 ...
- 二分图匹配 最大匹配数+最大点覆盖 POJ 1469+POJ 3041
最大匹配数就等于最大点覆盖,因为在图里面,凡是要覆盖的点必定是连通的,而最大匹配之后,若还有点没有覆盖到,则必定有新的匹配,与最大匹配数矛盾,如果去掉一些匹配,则必定有点没有覆盖到. POJ 1469 ...
随机推荐
- SSM整合配置文件的主要内容
web.xml: <servlet> <setvlet-name>springMVC</setvlet-name> <!-- 配置前端控制器 --> & ...
- 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
适用场景 用户希望将特定云服务下的所有虚拟机从经典部署模型(以下简称:ASM)迁移到 Azure Resource Manager(以下简称:ARM). Note 如果云服务下使用 VNET 也希望将 ...
- SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志
在打开数据库的时候,突然出现异常错误,然后我去关闭sql server 服务,然后重启服务的时候,不能重启,出现以下错误 “请求失败或服务未及时响应.有关详细信息,请参见事件日志或其它适合的错误日志” ...
- jQuery中使用attribute,prop获取,设置input的checked值【转】
1.prop方法获取.设置checked属性 当input控件checkbox设置了checked属性时,无论checked=”“或 checked=”checked”,$(obj).prop(“ch ...
- Django中的DateTimeField格式
转自:http://www.nanerbang.com/article/5488/ 创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来 ...
- Hadoop 高可用(HA)的自动容灾配置
参考链接 Hadoop 完全分布式安装 ZooKeeper 集群的安装部署 0. 说明 在 Hadoop 完全分布式安装 & ZooKeeper 集群的安装部署的基础之上进行 Hadoop 高 ...
- Mysql引擎innodb_pool的作用
innodb_buffer_pool的简介: InnoDB主索引是聚簇索引,索引与数据共用表空间,对于InnoDB而言,数据就是索引,索引就是数据.InnoDB缓存机制和MyISAM缓存机制的最大区别 ...
- Docker容器学习与分享04
Docker容器的基本操作(2) 基于docker分享03的centos容器,接着学习docker容器的基本操作. docker分享03中创建了一个centos镜像,如果想要查看容器的具体信息就要使用 ...
- 团队作业7——第二次项目冲刺(Beta版本)day3
项目成员: 曾海明(组长):201421122036 于波(组员):201421122058 蓝朝浩(组员):201421122048 王珏 (组员):201421122057 叶赐红(组员):20 ...
- python第三十四课——2.匿名函数配合容器函数的使用
匿名函数配合容器函数的使用(了解) 1.匿名函数配合列表对象使用 lt=[lambda x:x**2,lambda x:x**3,lambda x:x**4] for i in lt: print(i ...