链接

https://www.lydsy.com/JudgeOnline/problem.php?id=1741

思路

消除所有的小行星

每个点(x,y)只有选择x或者y才能被覆盖

二分图最小点覆盖=最大流

首先,最小顶点覆盖一定>=最大匹配,因为假设最大匹配为n,那么我们就得到了n条互不相邻的边,光覆盖这些边就要用到n个点。剩下的点就不用去管他,要不然m就!=最大匹配

不明白就去这里

左边横边,右边竖边

然后开心的跑最大流就可以

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. const int N=5e5+7,inf=0x3f3f3f3f;
  6. using namespace std;
  7. int read() {
  8. int x=0,f=1;char s=getchar();
  9. for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
  10. for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
  11. return x*f;
  12. }
  13. int n,m,S,T;
  14. struct node {
  15. int v,nxt,cap;
  16. }e[N<<1];
  17. int head[N<<1],cnt=1;
  18. void add_edge(int u,int v,int cap) {
  19. e[++cnt].v=v;
  20. e[cnt].cap=cap;
  21. e[cnt].nxt=head[u];
  22. head[u]=cnt;
  23. }
  24. void Add(int u,int v,int cap) {
  25. add_edge(u,v,cap);
  26. add_edge(v,u,0);
  27. }
  28. int dis[N];
  29. bool bfs() {
  30. queue<int> q;
  31. memset(dis,-1,sizeof(dis));
  32. q.push(S);
  33. dis[S]=0;
  34. while(!q.empty()) {
  35. int u=q.front();
  36. q.pop();
  37. for(int i=head[u];i;i=e[i].nxt) {
  38. int v=e[i].v;
  39. if(dis[v]==-1&&e[i].cap) {
  40. dis[v]=dis[u]+1;
  41. q.push(v);
  42. }
  43. }
  44. }
  45. return dis[T]!=-1;
  46. }
  47. int dfs(int u,int f) {
  48. if(u==T) return f;
  49. int rest=f;
  50. for(int i=head[u];i;i=e[i].nxt) {
  51. int v=e[i].v;
  52. if(e[i].cap&&dis[v]==dis[u]+1&&rest) {
  53. int t=dfs(v,min(e[i].cap,rest));
  54. if(!t) dis[v]=0;
  55. e[i].cap-=t;
  56. e[i^1].cap+=t;
  57. rest-=t;
  58. }
  59. }
  60. return f-rest;
  61. }
  62. int dinic() {
  63. int ans=0;
  64. while(bfs())
  65. ans+=dfs(S,inf);
  66. return ans;
  67. }
  68. int main() {
  69. // freopen("a.in","r",stdin);
  70. n=read(),m=read();
  71. S=1001,T=1002;
  72. for(int i=1;i<=n;++i) Add(S,i,1),Add(i+n,T,1);
  73. for(int i=1;i<=m;++i) {
  74. int x=read(),y=read();
  75. Add(x,y+n,1);
  76. }
  77. int ans=dinic();
  78. printf("%d\n",ans);
  79. }

bzoj1741 [Usaco2005 nov]Asteroids 穿越小行星群 最小点覆盖的更多相关文章

  1. bzoj 1741: [Usaco2005 nov]Asteroids 穿越小行星群【最大点覆盖】

    二分图最大点覆盖模型,因为对于一个点(x,y)显然只要选x或者y就好了,于是连边,跑最大匹配=最大点覆盖(不会证) #include<iostream> #include<cstdi ...

  2. bzoj1741 [Usaco2005 nov]Asteroids 穿越小行星群

    网络流,对于每一个行星,将行星所在行到行星连一条流量为1的边,将行星到其所在列连一条流量为1的边,从源点到所有行连一条流量为1的边,将所有列到汇点都连一条流量为1的边,最大流即为答案. 代码 #inc ...

  3. 1741: [Usaco2005 nov]Asteroids 穿越小行星群

    1741: [Usaco2005 nov]Asteroids 穿越小行星群 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 231  Solved: 166 ...

  4. BZOJ 1741: [Usaco2005 nov]Asteroids 穿越小行星群

    Description 贝茜想驾驶她的飞船穿过危险的小行星群.小行星群是一个NxN的网格(1≤N≤500),在网格内有K个小行星(1≤K≤10000). 幸运地是贝茜有一个很强大的武器,一次可以消除所 ...

  5. 【BZOJ】1741: [Usaco2005 nov]Asteroids 穿越小行星群

    [题意]给定n*n网格,有k个物品,每次可以消灭一行或一列,求消灭掉所有物品的最少操作次数. [算法]二分图最小覆盖 [题解]此题是最小覆盖模型的出处. 将物品的x-y连边建立二分图. 最小覆盖:选择 ...

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

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

  7. Asteroids POJ - 3041 【最小点覆盖集】

    Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N g ...

  8. [USACO2005][POJ2226]Muddy Fields(二分图最小点覆盖)

    题目:http://poj.org/problem?id=2226 题意:给你一个字符矩阵,每个位置只能有"*"或者“.",连续的横着或者竖的“*"可以用一块木 ...

  9. [Usaco2005 Nov]Asteroids

    Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape o ...

随机推荐

  1. sql server 中DateName()函数及DatePart()函数

    Datepart():返回代表指定日期的指定日期部分的整数 语法:Datepart(datepart,date)  返回类型:int DateName():返回代表指定日期的指定日期部分的字符串 语法 ...

  2. http与https区别

    1.安全. 内容采用对称加密,身份认证.建立一个信息安全通道来保证数据传输的安全.采用对称加密算法,来加密真实传输的数据.采用非对称加密算法(公钥和私钥),来保证连接的安全性.防止内容被第三方冒充和篡 ...

  3. 十 js中forEach,for in,for of循环的用法

    一.一般的遍历数组的方法: var array = [1,2,3,4,5,6,7]; for (var i = 0; i < array.length; i++) { console.log(i ...

  4. 使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题(转http://blog.csdn.net/slimboy123/article/details/4366701)

    用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和D ...

  5. codeforces 975C Valhalla Siege

    题意: 有n个巫师站成一列,每个巫师有自己的血量. 一个人射箭攻击他们,每次造成若干点伤害,巫师按照给定的顺序承受伤害,如果伤害大了,那么死掉,伤害落到下一个巫师身上. 如果一轮攻击之后,所有的巫师都 ...

  6. Java基础语法(一 )

    一.关键字 关键字概述 被Java语言赋予特定含义的单词 关键字特点 组成关键字的字母全部小写 关键字注意事项 goto和const作为保留字存在,目前并不使用 关键字单词 用于定义数据类型的关键字 ...

  7. hive 将一个分区表数据全部插入另外一个分区表

    假如现在hive有个分区表A,分区字段为dt 需求是:需要将A表中的数据全部插入到分区表B中 具体步骤如下: 1.create B like A: 2.插入数据 set hive.exec.dynam ...

  8. scrapy框架 + selenium 爬取豆瓣电影top250......

    废话不说,直接上代码..... 目录结构 items.py import scrapy class DoubanCrawlerItem(scrapy.Item): # 电影名称 movieName = ...

  9. mybatis源码解析5---SqlSession解析

    由之前解析可知,mybatis启动的时候会加载XML配置文件解析生成全局配置对象Configuration对象,SqlSessionFactoryBuilder类会根据Configuration对象创 ...

  10. Numpy 通用函数

    frompyfunc的调用格式为frompyfunc(func, nin, nout),其中func是计算单个元素的函数,nin是此函数的输入参数的个数,nout是此函数的返回值的个数 # 注:用fr ...