二分图
Keep_Trying_Go
无
展开
-
HDU1083(二分图-匈牙利算法)
题意:课程个数p,学生个数n,一门课程由若干学生选择。每门课程选择一个课代表,一个学生只能担任一门课的课代表,问是否存在这样的最大匹配。#include<iostream>#include<cmath>#include<algorithm>#include<cstring>using namespace std;const int maxx=305;int used[maxx];int nxt[maxx];int line[maxx][max原创 2021-09-17 19:55:38 · 125 阅读 · 0 评论 -
poj3692(二分匹配)
最大孩子数=(男孩子数+女孩子数)-最大匹配数#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>using namespace std;const int maxx=1005;const int inf=0x3f3f3f3f;int used[maxx];int line[maxx][maxx];int nx原创 2021-05-14 11:37:32 · 117 阅读 · 0 评论 -
HDU1350(最小路径覆盖问题)
题意:给出出发时间,出发地点和达到目的地点。因为把一个城市建模成一个矩形网格,所以从出发点到目的地点的时间为|x-s|+|y-t|,又因为出租车需要提前一分钟到,所以需要加一:if(time+1+num[i].end<=num[j].start){ line[i][j]=1;}最小路径覆盖数:对于一个DAG(有向无环图),选取最少条路径,使得每个 顶点属于且仅属于一条路径。路径长度可以为零;(有向图中找一些路径,使之覆盖了图中的所有顶点,就是任意一个顶点都跟那些路径中的某一条关联,且原创 2021-05-13 17:31:54 · 127 阅读 · 0 评论 -
HDU4160(最小路径覆盖问题)
题意:当满足条件wi<wj,hi<hl和li<lj时,求解通过优化嵌套给定的娃娃可以获得的最外层洋娃娃的最小数量。思路:如果嵌套的娃娃越多,则剩下的娃娃就越少,意味着单独出来的娃娃越少,转换为求解最小路径覆盖问题。最小路径覆盖数:对于一个DAG(有向无环图),选取最少条路径,使得每个 顶点属于且仅属于一条路径。路径长度可以为零;(有向图中找一些路径,使之覆盖了图中的所有顶点,就是任意一个顶点都跟那些路径中的某一条关联,且任何一个顶点有且只有一个与之关联)最小路径覆盖数(最少边覆盖原创 2021-05-13 16:20:06 · 167 阅读 · 0 评论 -
poj1548(最小路径覆盖问题)
题意:相当于给出N个坐标点,因为机器人只能向下或者向右走,所以如果能到达其他点,则连接这两个点,即line[i][j]=1最小路径覆盖数:对于一个DAG(有向无环图),选取最少条路径,使得每个 顶点属于且仅属于一条路径。路径长度可以为零;(有向图中找一些路径,使之覆盖了图中的所有顶点,就是任意一个顶点都跟那些路径中的某一条关联,且任何一个顶点有且只有一个与之关联)最小路径覆盖数(最少边覆盖)=顶点数-最大匹配数;思路:把每个点都拆成两个点,分为入点和出点,如果 u 到 v 有边,那么我们就让 u原创 2021-05-13 15:49:53 · 147 阅读 · 0 评论 -
poj2594(最小可相交覆盖路径问题)
最小可相交覆盖:先用floyd求出原图的传递闭包,即如果a->b有路径,b->c有路径,,则加边a->c。然后就转化成了最小路径覆盖问题(最小不相交路径覆盖问题)。最小路径覆盖数:对于一个DAG(有向无环图),选取最少条路径,使得每个 顶点属于且仅属于一条路径。路径长度可以为零;(有向图中找一些路径,使之覆盖了图中的所有顶点,就是任意一个顶点都跟那些路径中的某一条关联,且任何一个顶点有且只有一个与之关联)最小路径覆盖数(最少边覆盖)=顶点数-最大匹配数;思路:把每个点都拆成两个原创 2021-05-13 15:19:05 · 395 阅读 · 0 评论 -
poj1422(最小路径覆盖问题)
最小路径覆盖数:对于一个DAG(有向无环图),选取最少条路径,使得每个 顶点属于且仅属于一条路径。路径长度可以为零;(有向图中找一些路径,使之覆盖了图中的所有顶点,就是任意一个顶点都跟那些路径中的某一条关联,且任何一个顶点有且只有一个与之关联)最小路径覆盖数(最少边覆盖)=顶点数-最大匹配数;思路:把每个点都拆成两个点,分为入点和出点,如果 u 到 v 有边,那么我们就让 u 的入点连向 v 的出点 , 匈牙利 算出最大匹配。#include<iostream>#include&l原创 2021-05-13 15:04:58 · 255 阅读 · 0 评论 -
poj3686(最小权值完美匹配)
开始理解的有点简单了,也是看了其他的博客之后发现问题的:题意:因为每一个物件都是受前一个物件的时间限制,所以假设某台机器加工了k个订单,那么用时为t1 + (t1 + t2) + (t1 + t2 + t3)......(t1+...tk) = t1 * k + t2 * (k-1) + t3 * (k-2) +...+tk,于是把每个机器拆成N个点,1-N分别代表倒数第几个加工了这个订单;最小化N命令就是最后输出的答案ans/N。这个思路开始只是认为是KM算法,其实要理解这个条件。最小权值完美匹配就原创 2021-04-25 00:40:09 · 971 阅读 · 0 评论 -
HDU6346(最小权值完美匹配)
题意:满足 xi+yj≤ai,j(1≤i,j≤n) 的约束下最大化∑ni=1xi+∑ni=1yi,思路:采用最大权值完美匹配算法;但是现在这里是求最小权值完美匹配问题,所以只需要将权值取反最后在取反输出即可!但是我这个代码是超时,我还在查找问题当中,但是这个算法模版没有什么问题!#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queu原创 2021-04-25 00:11:03 · 606 阅读 · 0 评论 -
HDU1533(最小权完美匹配)
题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径。思路:平时使用都是最大权完美匹配,现在这道题要求最小权完美匹配,只需要将权值取反之后求最大权完美匹配就行。#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include&l原创 2021-04-24 23:42:33 · 466 阅读 · 0 评论 -
poj2195(最大权完美匹配)
题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径。思路:采用最大权完美匹配最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配。此时问题就转化为二分图最大权完美匹配。KM 算法核心为: 为每一点添加顶标, 在顶标的限制下用匈牙利算法处理出最大匹配数, 若最大匹配数 =n, 则达到最优解, 输出原创 2021-04-24 17:54:45 · 832 阅读 · 0 评论 -
poj1274(最大匹配)
匈牙利算法:有两个集合 A,B, 两个集合间有多条边连接集合中的点, 且单个集合中的点各不相连, 求两集合的点能两两配对的最大匹配数.思路:求解最大匹配数:方法一:#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<cstdio>using namespace std;const int maxx=505;const int原创 2021-04-24 16:16:16 · 213 阅读 · 0 评论 -
poj3565(最大权完美匹配)
题意:让N只蚂蚁到一棵苹果树,给出N个蚂蚁和N棵苹果树的对应坐标,求权值就是求坐标点之间的距离表示,要求求出最小的距离!思路:采用最大权完美匹配问题,但是现在这道题是求最小权值,可以将求得的坐标之间的距离取反,取反之后求最大权值就是最小的距离了。最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配。此时问题就转化为二分图最大权完美匹配。KM 算法核心为: 为每一点添加顶标, 在顶标的限原创 2021-04-24 15:14:24 · 398 阅读 · 0 评论 -
HDU3718(最大权完美匹配)
题意:先给出N个字母,代表要标签;再给出M行,和第一行给出的N个标签进行匹配,之间的差代表权值。最后的相似度为最大权值为ans*1.0/n.最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配。此时问题就转化为二分图最大权完美匹配。KM 算法核心为: 为每一点添加顶标, 在顶标的限制下用匈牙利算法处理出最大匹配数, 若最大匹配数 =n, 则达到最优解, 输出。否则修改顶标, 再用匈牙利原创 2021-04-24 14:32:05 · 222 阅读 · 0 评论 -
HDU2853(最大权完美匹配)
题意:要求改动公司数量最少并且效率最大(效率最大也就是最大完美匹配)其中有一个最大的问题就是最少改变公司数量(也就是最少改变多少条边)这个知识点我也是看了网上的,关于这个知识点我也感觉很神奇。除了这个问题其他的都是模版问题了。可以把每条边的权值扩大k倍,并且k要大于n。然后对原计划的边都+1。最小变动数量=N-加入原计划中的点数模版一:#include<iostream>#include<stdio.h>#include<string.h>#inclu原创 2021-04-24 12:20:52 · 188 阅读 · 0 评论 -
HDU3488(最大权完美匹配)
题意:有N个城市M单程公路将它们连接起来;要求路路应该包含一个或多个循环a->B->…->p->A.每个城市都应该走一条路,在一条线路上,每个城市只需要访问一次,也就是一个城市只能被一条线路覆盖(题目已经说明第一个城市和最后一个城市除外)思路:采用最大权完美匹配算法,但是最大完美匹配算法求的是最大权值,完美只要把所有的权值变为负值就可以了。将一个点拆成两个点求最大权完美匹配:最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连 接的边带有权值时,要寻找匹配原创 2021-04-24 10:27:05 · 217 阅读 · 0 评论 -
HDU2255(最全权完美匹配)
最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配。此时问题就转化为二分图最大权完美匹配。KM 算法核心为: 为每一点添加顶标, 在顶标的限制下用匈牙利算法处理出最大匹配数, 若最大匹配数 =n, 则达到最优解, 输出。否则修改顶标, 再用匈牙利算法处理, 如此重复。设二分图的两部分点集分别为 X={X1,X2,…,Xn}X={X1,X2,…,Xn} 和 Y={Y1,Y2,…,Ym}原创 2021-04-24 10:18:21 · 321 阅读 · 0 评论 -
HDU2063
求解二分图最大匹配数:#include<set>#include<map>#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxx=510;int t,n,m;int line[maxx][maxx];int used[m原创 2021-03-10 00:09:11 · 136 阅读 · 0 评论 -
HDU1179
求解二分图最大匹配数:#include<iostream>#include<algorithm> #include<cstring>#include<cmath>#include<set>using namespace std;const int maxx=510;int line[maxx][maxx];int nxt[maxx];int used[maxx];int n,m;bool Find(int x){ for(原创 2021-03-10 00:09:21 · 111 阅读 · 0 评论 -
HDU1068
求解最大独立集:#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<set>#include<map>#include<cstdio>using namespace std;const int maxx=510;int line[maxx][maxx];int used[maxx];int nxt[原创 2021-03-10 00:09:33 · 124 阅读 · 0 评论 -
HDU1150
求解二分图的最大匹配数问题:#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map>#include<set>#include<utility>#include<cmath>#include<iomanip>using namespace std;const int ma原创 2021-03-10 00:09:42 · 114 阅读 · 0 评论 -
HDU1151
最小路径覆盖数=顶点数-最大匹配数。#include<iostream>#include<algorithm>#include<set>#include<map>#include<cstring>#include<cstdio>#include<vector>#include<utility>#include<iomanip>using namespace std;const i原创 2021-03-10 00:09:52 · 113 阅读 · 0 评论 -
poj3041
求解最大匹配数。#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<utility>#include<set>#include<vector>#include<iomanip>using namespace std;const int maxx=510原创 2021-03-10 00:10:01 · 120 阅读 · 0 评论 -
poj3020
最小路径覆盖问题=顶点数-最大匹配数。#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<map>#include<set>#include<iomanip>#include<cmath>#include<vector>#include<utility>#incl原创 2021-03-10 00:10:11 · 76 阅读 · 0 评论