2011年10月4日
摘要: HDU_3435这是一个求最小权完美匹配的题目,我在使用KM算法建立邻接表时,要把边的权值初始化为MAX-w[e],然后去求最大权的完美匹配,并在计算结果的时候再转化回来即可。由于是无向图,所以我们需要对每条无向边建立两条有向边。#include<stdio.h>#include<string.h>#define MAXD 1010#define MAXM 20010#define MAX 10001#define INF 1000000000int first[MAXD], next[MAXM], v[MAXM], w[MAXM], N, M;int yM[MAXD] 阅读全文
posted @ 2011-10-04 22:51 Staginner 阅读(360) 评论(2) 推荐(0)
摘要: HDU_3488值得一提的是,如果我们用KM算法求最小权完美匹配时,要把边的权值初始化成MAX-G[i][j]然后去求最大权的完美匹配,计算结果的时候再转化回来即可。如果把G[i][j]初始化成-G[i][j]去求最大权的完美匹配的话,我写的程序会超时,暂时没有明白是这个想法有问题还是我的写法有问题。#include<stdio.h>#include<string.h>#define MAXD 210#define INF 1000000000#define MAX 10001int yM[MAXD], G[MAXD][MAXD], N;int visx[MAXD], 阅读全文
posted @ 2011-10-04 21:20 Staginner 阅读(307) 评论(0) 推荐(0)
摘要: HDU_1853首先,如果要保证图有环,并且环之间没有交点的话,那么必然每个点的出度和入度都应为1,因此我们可以把一个点拆成两个点,分别表示出度及入度,然后去找拆点后构成的二分图的完美匹配。对于怎么判断原图是否能构成完美匹配,我暂时想到了两个思路:①在用KM算法之前先用匈牙利算法求最大匹配,如果最大匹配数为N,那么就一定会存在完美匹配。②我们可以从KM算法的slack变量入手,每一次更新slack,都是在尝试进行新一轮的增广,并且会把更多的原本不在交错树中的点加入进来,当把所有可以加到交错树中点都加入之后,slack就不会再进行更新。换句话讲,如果slack不再更新,那么一定是把所有可以加到交 阅读全文
posted @ 2011-10-04 19:40 Staginner 阅读(335) 评论(0) 推荐(0)
摘要: HDU_2225这个是我的第一个二分图最优匹配的题目。EK算法个人感觉就像是匈牙利算法基础上的条件增广,即只有在A[x]+B[y]==W[x,y]的时候才进行增广,同时初始化以及算法进行过程中都要保证A[x]+B[y]>=W[x,y],如果不能实现增广再进行一定的策略降低未能匹配的x、y的A[x]+B[y]的值,这样在进行增广的过程中就可以保证每次最先达成的匹配都是最优的。在寻找增广路的过程中,如果发现不能进行增广,那么我们会得到一棵交错树,其中可以把x顶点全部看做叶子节点。这时我们用一个变量slack表示需要进行修改的幅度,其值等于min{A[x]+B[y]-W[x,y]}(其中x为交 阅读全文
posted @ 2011-10-04 14:38 Staginner 阅读(326) 评论(0) 推荐(0)
摘要: POJ_3683这是一个2-SAT的问题,其实算法以及构图并不难想,但是编码的复杂度比较高。在构图的时候,我们需要判断两段时间是否相交,比较容易的办法就是if(s1<t2&&t1>s2),其中[s1,t1]、[s2,t2]为两段时间。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 2010#define MAXM 4000010int S[MAXD], T[MAXD], D[MAXD], N;int Gfirst[MAXD], Gnext[MAXM 阅读全文
posted @ 2011-10-04 03:13 Staginner 阅读(303) 评论(0) 推荐(0)