二分匹配
BEconfidence
坚持才是胜利之道
展开
-
HDU 1151 Air Raid(最小路径覆盖)
二分图匹配(匈牙利算法的DFS实现)初始化:g[][]两边顶点的划分情况建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配g没有边相连则初始化为0uN是匹配左边的顶点数,vN是匹配右边的顶点数调用:res=hungary();输出最大匹配数优点:适用于稠密图,DFS找增广路,实现简洁易于理解时间复杂度:O(VE)*******************原创 2015-06-16 20:56:12 · 765 阅读 · 0 评论 -
hdu1498最小点覆盖
1.题意:(很是重要,理解了题意才能有转换为最小点覆盖的思路),对于一个n*n的矩阵,里面有一些颜色不同的气球(用1~50标记种类),给你K次机会,每次机会可以把某一行或者某一列中的某一种颜色全部消灭,问你K次消灭之后,有哪些颜色是你不能消灭完的....拿题目的案例 2 来画图:我们这里只有K=1次机会去消除,,我们只有四种方式,从图中来看,1次机会我们不可能把1号颜色全部消除原创 2015-06-17 17:06:25 · 940 阅读 · 0 评论 -
hdu 1528 Card Game Cheater (最小覆盖)
#include"stdio.h"#include"string.h"#define N 52int map[N][N],v[N],link[N];int A[N],B[N],t,n;int dfs(int k){ int i; for(i=1;i<=n;i++) { if(map[k][i]&&!v[i]) {原创 2015-06-17 17:21:08 · 1044 阅读 · 0 评论 -
HDU 1507 Uncle Tom's Inherited Land*(二分匹配,输出任意一组解)
要输出任意一组解。一开始时两边都是n*m-k个点做的,答案输出一半,但是错掉了,匹配数没有问题,就是输出解会出错。后来按照奇偶分成两部分就可以了#include#include#include#include#includeusing namespace std;const int MAXN=510;int uN,vN;int g[MAXN][MAXN];int link原创 2015-06-17 17:39:25 · 718 阅读 · 0 评论 -
hdu1150 Machine Schedule
有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。二分图的最小顶点覆盖数=最大匹配数本题原创 2015-06-16 20:32:48 · 756 阅读 · 0 评论 -
hdu 1281 棋盘游戏
将行和列的标号组成X和Y集合,然后如果x,y坐标可以放车,就在x和y点之间连一条线,不同行和列车就不会相互攻击,所以求出最大匹配就是所得的最多可放车额个数然后枚举每个点,判断其是否为重要点#include#include#includeusing namespace std;#define N 102int map[N][N],visit[N],match[N];int n,m,原创 2015-06-16 20:54:46 · 625 阅读 · 0 评论 -
最大二分匹配hdu5093
两个集合分别是按行和列凑成的点的集合如图10000000220300041000000012030003两个集合构成的边,求该图的最大二分匹配#includeusing namespace std;bool edge[3000][3000];char mapp[100][100];in原创 2015-08-06 20:48:09 · 591 阅读 · 0 评论 -
最大二分匹配
这个相当于把两两的关系搞成图求的是所有边的子集,使得这个子集没有两两无公共点这个代码不好理解#includeusing namespace std;#define MAX_V 100int V;vector G[MAX_V];int match[MAX_V];bool used[MAX_V];void add_edge(int u,int v){ G[u].pu原创 2015-08-06 20:22:42 · 570 阅读 · 0 评论 -
最大二分图hdu5091
今天的B题我是想爆出来的,当时想的不错,但后来发现这样爆行不通前面的*点就不是最优了但是我环视要存起来#includeusing namespace std;int n,m;char S[60][60];int IDd[60][60];int IDd2[60][60];void dfs(int r,int c,int id){// printf("r%d c%原创 2015-08-06 20:20:55 · 763 阅读 · 0 评论