二分图最大匹配。

建图:按照每行与每列的连接!比如,第一行与第一列、第三列连接。。。

这样就可以建立一个二分图。然后,求出最小点覆盖,即求出最少的点数,这些点可以把所有的边都覆盖。

最小点覆盖=最大匹配。

写了两种匹配,匈牙利(Hungary) 和 Hopcroft-Karp

1. Hungary()

#include<iostream>
using namespace std;int g[505][505];
int vis[505];
int link[505];
int n,k;int dfs(int u)
{for(int i=1;i<=n;i++)if( !vis[i] && g[u][i] ){vis[i]=1;if( link[i]==-1 || dfs(link[i]) ){link[i]=u;return 1;}}return 0;
}int Hungary()
{int ans=0;memset(link,-1,sizeof(link));for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));ans+=dfs(i);}return ans;
}int main()
{while(scanf("%d %d",&n,&k)==2){memset(g,0,sizeof(g));for(int i=0;i<k;i++){int a,b;scanf("%d %d",&a,&b);g[a][b]=1;}int ans=Hungary();printf("%d\n",ans);}return 0;
}

2.H_K()

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
using namespace std;
#define INF 10000000int g[505][505];
int linkx[505],linky[505];
int distx[505],disty[505];
int vis[505];
queue<int> q;
int n,k;
int dis;bool findSearch()
{while( !q.empty() ) q.pop();memset(distx,-1,sizeof(distx));memset(disty,-1,sizeof(disty));for(int i=1;i<=n;i++)if( linkx[i]==-1 ){q.push(i);distx[i]=0;}dis=INF;while( !q.empty() ){int u=q.front();q.pop();if( distx[u]>dis ) break;for(int i=1;i<=n;i++)if( disty[i]==-1 && g[u][i] ){disty[i]=distx[u]+1;if( linky[i]==-1 ) dis=disty[i];else{distx[linky[i]]=disty[i]+1;q.push(linky[i]);}}}return dis<INF;
}int findPath(int u)
{for(int i=1;i<=n;i++)if(  !vis[i] && g[u][i] && disty[i]==distx[u]+1 ){vis[i]=1;if( disty[i]==dis && linky[i]!=-1 )continue;if( linky[i]==-1 || findPath(linky[i]) ){linky[i]=u;linkx[u]=i;return 1;}}return 0;
}int H_K()
{memset(linkx,-1,sizeof(linkx));memset(linky,-1,sizeof(linky));int ans=0;while( findSearch() ){memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++)if( linkx[i]==-1 )ans+=findPath(i);}return ans;
}int main()
{
//  freopen("in.txt","r",stdin);while(scanf("%d %d",&n,&k)==2){memset(g,0,sizeof(g));for(int i=0;i<k;i++){int a,b;scanf("%d %d",&a,&b);g[a][b]=1;}int ans=H_K();printf("%d\n",ans);}return 0;
}

poj 3014 Asteroids相关推荐

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

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

  2. POJ T3041 Asteroids

    POJ T3041 Asteroids 题解: 如果没学过匈牙利算法的话,鄙人感觉会去暴力. 匈牙利算法已经有很好的博客了,鄙人就不在这赘述了. 代码: #include<cstdio> ...

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

    题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...

  4. POJ 3041 Asteroids(最小点覆盖)题解

    题意:n*n的网格中有k个点,开一枪能摧毁一行或一列的所有点,问最少开几枪 思路:我们把网格看成两个集合,行集合和列集合,如果有点x,y那么就连接x->y,所以我们只要做最小点覆盖就好了. 参考 ...

  5. POJ 3041 Asteroids 二分图匹配

    以行列为点建图,每个点(x,y) 对应一条边连接x,y.二分图的最小点覆盖=最大匹配 //#pragma comment(linker, "/STACK:1024000000,1024000 ...

  6. POJ - 3041 Asteroids(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目分析:给出一个n*n的矩阵,其中有m个敌人,每一次操作可以清除某一列或某一行中的所有敌人,问若想清除所有敌人,至少需要多少次操作 题目分析:第一次见这种题,就是最小覆盖是要用最 ...

  7. poj 3041 Asteroids

    这是一道二分匹配题,根据Konig定理:最大匹配数=最小覆盖数: 这里我们以行为左边,以列为右边建图,这样建好后,就是一个裸的二分匹配: View Code #include<iostream& ...

  8. POJ 3041 Asteroids (最小顶点覆盖)

    题目类型  最小顶点覆盖 题目意思 给出最多10000个点的坐标 每次可以消除同一行的点或同一列的点 问至少要多少次才能把所有点都消除掉 解题方法 首先建图 每一个行号为一个点 每一个列号为一个点 那 ...

  9. POJ 图论分类 + DP(较全 自己又加了点)

    DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...

最新文章

  1. css flexbox模型_5分钟内学习CSS Flexbox-初学者教程
  2. 一张图看懂字节跳动8年创业史,一路逆袭!
  3. 计算机基础课教学心得,计算机基础教学心得
  4. 在html中引入css内部样式表使用,CSS样式学习笔记(三)html文件引入CSS的方法(2)...
  5. 怀旧服服务器怎么调整显卡性能,用顶级配置玩wow怀旧服是怎样的体验?
  6. 31 FI配置-财务会计-应收账款和应付账款-定义容差组(供应商)
  7. 二级VB培训笔记08:公共基础知识
  8. 设计图书馆oracle触发器,Oracle触发器开发与设计
  9. java代码启动spring_javascript - 从JavaScript调用Java代码( Spring 启动)
  10. “抗疫”新战术:世卫组织联合IBM、甲骨文、微软构建了一个开放数据的区块链项目!...
  11. python基础编程语法-1.Python基础语法
  12. SQL Server数据表在编程中实现导出EXCEL的几种方法
  13. Android小游戏------猜数字
  14. python 编译成exe vmp加密_加密软件VMProtect入门教程
  15. echarts循环图表
  16. win7 快速启动栏 里的快捷方式存放路径
  17. PostgreSQL DBA(81) - Locks(FOR UPDATE SKIP LOCKED)
  18. Verilog语言入门
  19. dart-sass 和 node-sass 的区别
  20. AARRR(海盗模型)|原理+Python可视化实现

热门文章

  1. [ahk]选中内容 按热键即发音
  2. 搭建短视频被动收益系统的资源网站,实现月入过万
  3. 一个Spring Bean从诞生到逝去的九次人生转折!
  4. 非平衡电桥电阻计算_【2019年整理】用非平衡电桥测量电阻
  5. 连续自然数平立方求和推导
  6. 颜色映射poj1046(今天刚刚开通csdn,小试一下)
  7. Linux垃圾箱位置,将Linux rm命令删除的文件放入垃圾箱的方法
  8. Unity二维平面上物体的移动(十二)-抛物线推动力
  9. 图片压缩的正确打开方式
  10. 【Android】 炫酷霓虹灯