两道二分图的练手题。

  3041:题意大概是在一个N*N的图上有K个东西,你每次可以清除一行或一列上的所有东西。让你求最少的操作次数。

  我们根据题意建图。对于每一个点的坐标(x,y)之间连一条边。比如样例:

  

  由于每条边代表着一个点,因此我们只需要找出最少的点来联结所有的边,也就是最小顶点覆盖=最大匹配

  CODE

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. const int K=;
  5. struct data
  6. {
  7. int to,next;
  8. }e[K];
  9. int head[K],from[K],n,m,x,y,k,i,ans;
  10. bool vis[K];
  11. inline void read(int &x)
  12. {
  13. x=; char ch=getchar();
  14. while (ch<''||ch>'') ch=getchar();
  15. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  16. }
  17. inline void add(int x,int y)
  18. {
  19. e[++k].to=y; e[k].next=head[x]; head[x]=k;
  20. }
  21. inline bool find(int now)
  22. {
  23. for (int i=head[now];i!=-;i=e[i].next)
  24. if (!vis[e[i].to])
  25. {
  26. vis[e[i].to]=;
  27. if (!from[e[i].to]||find(from[e[i].to]))
  28. {
  29. from[e[i].to]=now;
  30. return ;
  31. }
  32. }
  33. return ;
  34. }
  35. int main()
  36. {
  37. memset(e,-,sizeof(e));
  38. memset(head,-,sizeof(head));
  39. read(n); read(m);
  40. for (i=;i<=m;++i)
  41. {
  42. read(x); read(y);
  43. add(x,y+n);
  44. }
  45. for (i=;i<=n;++i)
  46. {
  47. memset(vis,,sizeof(vis));
  48. ans+=find(i);
  49. }
  50. printf("%d",ans);
  51. return ;
  52. }

  3020:题意是在一个h*w的图上,每次可以找相邻的(即上下左右四个方向)两个城市(在图中为‘*’),不能重复地建一个信号基站。问最少的建立个数是多少。

  同理,我们可以找出城市,在相邻的两点之间连边。由于只有两点间能连边,所以这是一个二分图。

  然后要求覆盖所有的城市,就可以转化成最小边覆盖=节点个数-最大匹配/2(因为建的是无向图)

  CODE

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=,M=,fx[]={,,,-},fy[]={,,-,};
  6. struct data
  7. {
  8. int to,next;
  9. }e[N*M*];
  10. int head[N*M],from[N*M],a[N][M],n,m,t,i,j,p,k,tot,ans;
  11. bool vis[N*M];
  12. char ch;
  13. inline void add(int x,int y)
  14. {
  15. e[++k].to=y; e[k].next=head[x]; head[x]=k;
  16. }
  17. inline bool find(int now)
  18. {
  19. for (int i=head[now];i!=-;i=e[i].next)
  20. if (!vis[e[i].to])
  21. {
  22. vis[e[i].to]=;
  23. if (!from[e[i].to]||find(from[e[i].to]))
  24. {
  25. from[e[i].to]=now;
  26. return ;
  27. }
  28. }
  29. return ;
  30. }
  31. int main()
  32. {
  33. scanf("%d",&t);
  34. while (t--)
  35. {
  36. memset(e,-,sizeof(e));
  37. memset(head,-,sizeof(head));
  38. memset(a,,sizeof(a));
  39. memset(from,,sizeof(from));
  40. scanf("%d%d",&n,&m);
  41. ans=tot=k=;
  42. for (i=;i<=n;++i)
  43. for (j=;j<=m;++j)
  44. {
  45. cin>>ch;
  46. if (ch=='*') a[i][j]=++tot;
  47. }
  48. for (i=;i<=n;++i)
  49. for (j=;j<=m;++j)
  50. for (p=;p<;++p)
  51. {
  52. int x=i+fx[p],y=j+fy[p];
  53. if (x>&&y>&&x<=n&&y<=m)
  54. if (a[x][y]) add(a[i][j],a[x][y]);
  55. }
  56. for (i=;i<=tot;++i)
  57. {
  58. memset(vis,,sizeof(vis));
  59. ans+=find(i);
  60. }
  61. printf("%d\n",tot-ans/);
  62. }
  63. return ;
  64. }

POJ 3041&&3020的更多相关文章

  1. POJ 2226 Muddy Fields (最小点覆盖集,对比POJ 3041)

    题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障 ...

  2. POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配)

    POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配) Description Bessie wants to navigate her spa ...

  3. 二分图 最小点覆盖 poj 3041

    题目链接:Asteroids - POJ 3041 - Virtual Judge  https://vjudge.net/problem/POJ-3041 第一行输入一个n和一个m表示在n*n的网格 ...

  4. POJ 3041 Asteroids (对偶性,二分图匹配)

    题目:POJ 3041 Asteroids http://poj.org/problem?id=3041 分析: 把位置下标看出一条边,这显然是一个二分图最小顶点覆盖的问题,Hungary就好. 挑战 ...

  5. poj 3041——Asteroids

    poj       3041——Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22604   Accep ...

  6. 二分图最大匹配(匈牙利算法) POJ 3041 Asteroids

    题目传送门 /* 题意:每次能消灭一行或一列的障碍物,要求最少的次数. 匈牙利算法:把行和列看做两个集合,当有障碍物连接时连一条边,问题转换为最小点覆盖数==二分图最大匹配数 趣味入门:http:// ...

  7. Asteroids POJ - 3041 二分图最小点覆盖

       Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...

  8. Asteroids POJ - 3041

    Asteroids POJ - 3041 题目大意:N*N的地图里,存在一些小行星,Bessie有个很牛x但又很耗蓝的武器,一次可以消灭一行或者一列的所有小行星,问最少使用多少次这个武器可以消灭所有的 ...

  9. 二分图匹配 最大匹配数+最大点覆盖 POJ 1469+POJ 3041

    最大匹配数就等于最大点覆盖,因为在图里面,凡是要覆盖的点必定是连通的,而最大匹配之后,若还有点没有覆盖到,则必定有新的匹配,与最大匹配数矛盾,如果去掉一些匹配,则必定有点没有覆盖到. POJ 1469 ...

随机推荐

  1. View的layout机制

    View框架的工作流程为:测量每个View大小(measure)-->把每个View放置到相应的位置(layout)-->绘制每个View(draw). 源代码分析 在View的源代码中, ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析

    机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...

  3. 使用GitHub-Pages创建博客和图片上传问题解决

    title: 使用GitHub Pages创建博客和图片上传问题解决 date: 2017-10-22 20:44:11 tags: IT 技术 toc: true 搭建博客 博客的搭建过程完全参照小 ...

  4. SerialPort类的用法与示例

    转:https://www.cnblogs.com/hwBeta/p/6926363.html Microsoft .Net框架SerialPort类的用法与示例 从Microsoft .Net 2. ...

  5. Azure 门户中基于角色的访问控制入门

    面向安全的公司应侧重于向员工提供他们所需的确切权限. 权限过多,可能会向攻击者公开帐户. 权限太少意味着员工无法有效地完成其工作. Azure 基于角色的访问控制 (RBAC) 可通过为 Azure ...

  6. Android高级_第三方框架Xutils

    xutils的功能主要包括有四个部分:(1)布局视图关联:(2)图片下载与缓存:(3)网络请求:(4)数据库: 1. 使用xutils进行视图注入: (1)在控件声明上方添加@ViewInject() ...

  7. fatal: cannot create directoryxxxx': Invalid argument

    问题:fatal: cannot create directoryxxxx': Invalid argument 环境:git 拉取远程仓库的代码后 原因:同事是mac,这个文件夹命名规则在苹果上没有 ...

  8. 如何修改word文档中每行字符的最大默认值和每页最大行数默认值

    事情起因是这样的,小明在写论文的过程中,发现自己的文档的字与字的间距看起来比其他人的字符间距大,于是觉得奇怪,明明设置了一样的格式啊,设置每行38个字符,每页34行,为什么小明写的文档字符间距看着比较 ...

  9. Python接口自动化--URL参数的编码和解码 6

    # _*_ coding:utf-8 _*_ #python2 import urllib #有时,需要从上一个请求的url获取参数,传到下一个请求中,中文会显示为编码的形式,这时候就需要进行解码 u ...

  10. 使用let声明变量的理解

    先看阮大神的[ECMAScript 6 入门]中关于这一部分的描述 var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { ...