随笔分类 -  二分图最大匹配

摘要:思路:枚举每个位置的最小字符,用最大匹配判断是否可行#include#include#include#include#include#define Maxn 1010using namespace std;int match[Maxn],vi[Maxn],num[Maxn],g[Maxn][Maxn],f[Maxn],ch[Maxn],n,le;void init(){ memset(match,-1,sizeof(match)); memset(vi,0,sizeof(vi)); memset(num,0,sizeof(num)); memset(g,0,sizeof... 阅读全文
posted @ 2013-10-12 17:27 fangguo 阅读(210) 评论(1) 推荐(0)
摘要:思路:把所有涉及到的点按(x+y)的奇偶分成两部分点,对所有的1*2的骨牌,都有(x+y)为偶数的建到奇数的边。求一次最大匹配,就是答案。#include#include#include#include#include#define Maxn 2010using namespace std;int match[Maxn],map[Maxn][Maxn],vi[Maxn],ny,nx,graphic[Maxn][Maxn];struct Point{int x, y;}hori[Maxn],vert[Maxn];void init(){ memset(map,0,sizeof(map));... 阅读全文
posted @ 2013-07-26 09:02 fangguo 阅读(178) 评论(0) 推荐(0)
摘要:思路:将所有的直线的两个端点和城市混在一起,将能直接到达的两个点连线,求一次floyd最短路径。二分枚举bag容量,然后按给的要先后占领的城市由前向后,把能到一步到达的建一条边。然后求一次最小路径覆盖,就是最少需要多少个士兵才能全部占领,跟给出的p值进行比较。#include#include#include#include#include#define Maxn 510#define Maxm Maxn*Maxn#define eps 1e-6#define inf 100000000using namespace std;int match[Maxn],vi[Maxn],graphic[Ma 阅读全文
posted @ 2013-07-25 09:18 fangguo 阅读(298) 评论(0) 推荐(0)
摘要:思路:将ant与tree之间用距离来做权值,求最小权匹配就可以了。可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小。就像斜边永远比直角边长一样的道理。#include#include#include#include#include#define Maxn 110#define Eps 0.000001using namespace std;int sx[Maxn],sy[Maxn],match[Maxn],n;double lx[Maxn],ly[Maxn],weight[Maxn][Maxn],slack[Maxn];struct Point{ .. 阅读全文
posted @ 2013-07-17 14:52 fangguo 阅读(204) 评论(0) 推荐(0)
摘要:就是最基本的二分图最优匹配,将每个人向每个房子建一条边,权值就是他们manhattan距离。然后对所有权值取反,求一次最大二分图最优匹配,在将结果取反就行了。#include#include#include#include#define Maxn 110using namespace std;int n;//点的数目int lx[Maxn],ly[Maxn]; //顶点标号int weight[Maxn][Maxn];// 边的权值int slack[Maxn];// Y(i)的松弛函数int sx[Maxn],sy[Maxn]; //标记X,Y中的顶点是否在交错路径上int match[Ma 阅读全文
posted @ 2013-07-17 11:33 fangguo 阅读(496) 评论(0) 推荐(0)
摘要:题意:会给出M个串,我们要做的就是将这M个串给清除了。对于任意两个串,若二进制形式只有一位不一样,那么这两个串可以在一次操作消除,否则每个操作只能消除一个串。3 3*01100011可以代表的串是001101100011那么我们可以先用 10*把 101 和 100 消除了,再用 0*1把001 和 011 消除了。故操作次数为 2。解题思路:我们可以将所有的串先化为整数,并去重。然后对二进制形式只有一位不一样的两个数,我们由含有偶数个1的数向含有奇数个1的数连边,这样就确保了一定是二分图,因为不存在同含奇数个1或同含偶数个1 的数只相差一位。最后进行求最大匹配,既是我们可以省去的操作数。所以 阅读全文
posted @ 2013-07-16 21:21 fangguo 阅读(302) 评论(0) 推荐(1)
摘要:思路:如果我们将认识的建边,求最大独立集就是互相不认识的人数。那么我们反过来,将不认识的建图,求最大独立集就是互相认识的人数。#include#include#include#include#define Maxn 210int graphic[Maxn][Maxn],vi[Maxn],match[Maxn],n,m;int dfs(int u){ int i; for(i=1;i<=m;i++) { if(!vi[i]&&graphic[u][i]) { vi[i]=1; if(match[i]==-1... 阅读全文
posted @ 2013-07-16 17:01 fangguo 阅读(138) 评论(0) 推荐(0)
摘要:思路:由(i+j)为偶数的点向(i+j)为奇数的点建边。求一次最大匹配,若正好为空格数(不包含洞)的一半,即输出YES。#include#include#include#include#define Maxn 1101using namespace std;int n,m,vi[Maxn],match[Maxn],graphic[Maxn][Maxn],map[40][40],N[Maxn],M[Maxn],x,y;int dfs(int u){ int i; for(i=1;i<=y;i++) { if(!vi[M[i]]&&graphic[u][M[i]])... 阅读全文
posted @ 2013-07-16 15:23 fangguo 阅读(156) 评论(0) 推荐(0)
摘要:就是最简单的最大匹配,没的说#include#include#include#include#define Maxn 310using namespace std;int n,m,vi[Maxn],match[Maxn],graphic[Maxn][Maxn];int dfs(int u){ int i; for(i=1;i<=m;i++) { if(!vi[i]&&graphic[u][i]) { vi[i]=1; if(match[i]==-1||dfs(match[i])) {... 阅读全文
posted @ 2013-07-16 13:07 fangguo 阅读(155) 评论(0) 推荐(0)