/** 题目:poj3041 Asteroids 链接:http://poj.org/problem?id=3041 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一把枪,每一发子弹可以消除一行或者一列的障碍物, 问最少需要多少颗子弹可以清空障碍物? 思路:最小点集覆盖问题,等价于最大匹配.把所有的行看做二分图的左边的节点,所有的列看做二分图右边的节点. 如果f[i][j]==true;那么第i行与第j列有关系,连一条边.对这个二分图求最大匹配即可. 采用匈牙利算法. 匈牙利算法…
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Description Suppose that we have a square city with straight streets. A map of a city is a square board…
/** 题目:SAM I AM UVA - 11419 链接:https://vjudge.net/problem/UVA-11419 题意:给定n*n的矩阵,'X'表示障碍物,'.'表示空格;你有一把枪,每一发子弹可以消除一行或者一列的障碍物, 问最少需要多少颗子弹可以清空障碍物?以及输出具体的哪些行,哪些列. 思路:最小点集覆盖问题,等价于最大匹配. 求具体的哪些行,哪些列,需要借助于匈牙利树.从X中所有未匹配的点出发扩展匈牙利树,标记 树中的所有点,则X中所有的未标记点和Y中的所有标记点就…
题目连接 先试一下题/?/ 最小点集覆盖=最大匹配 /*根据i.j建图,跑一边最大匹配 */ #include<cstdio> #include<cstring> using namespace std; const int maxn=100+5; int maze[maxn][maxn]; int f[maxn]; bool vis[maxn]; int n,m,ans=0; bool maching(int x) { for(int i=1;i<=m;i++) { if(…
来源 最小点集覆盖==最大匹配. 首先,最小点集覆盖一定>=最大匹配,因为假设最大匹配为n,那么我们就得到了n条互不相邻的边,光覆盖这些边就要用到n个点. 现在我们来思考为什么最小点击覆盖一定<=最大匹配. 任何一种n个点的最小点集覆盖,一定可以转化成一个n的最大匹配.因为最小点集覆盖中的每个点都能找到至少一条只有一个端点在点集中的边. 如果找不到则说明该点所有的边的另外一个端点都被覆盖,所以该点则没必要被覆盖,和它在最小点集覆盖中相矛盾. 多个覆盖点都只能选则同一个点组成匹配的情况是不会出现…
Dolls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 869 Accepted Submission(s): 403 Problem Description Do you remember the box of Matryoshka dolls last week? Adam just got another box of dolls…
题意 给出一张有向无环图,求出用最少的路径覆盖整张图,要求路径在定点处不相交 输出方案 Sol 定理:路径覆盖 = 定点数 - 二分图最大匹配数 直接上匈牙利 输出方案的话就不断的从一个点跳匹配边 #include<cstdio> #include<queue> #include<cstring> using namespace std; , INF = 1e9 + ; inline int read() { , f = ; ; c = getchar();} + c…
Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25232   Accepted: 13625 Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K a…
嗯... 题目链接:http://poj.org/problem?id=3041 这道题的思想比较奇特: 把x坐标.y坐标分别看成是二分图两边的点,如果(x,y)上有行星,则将(x,y)之间连一条边,而我们要做的就是要找尽量少的点把所有的边覆盖,即为最小点覆盖问题,根据König定理:最小覆盖点数=最大匹配数,所以就可以用匈牙利算法求最大匹配了. AC代码: #include<cstdio> #include<cstring> #include<iostream> us…
求最小点覆盖数,即最大匹配数,匈牙利算法. #include<stdio.h> #include<string.h> ][],vis[],linker[];//linker[]记录V2中的点i在V1中所匹配的点x的编号 int n,k; int dfs(int x) { ; i <= n; i++) { if (map[x][i] && !vis[i])//x到i有边且i点未被标记 { vis[i] = ; if (!linker[i]||dfs(linker…