上一页 1 ··· 68 69 70 71 72 73 74 75 76 ··· 85 下一页
  2011年10月5日
摘要: HDU_2426这个题目是一个求最大权完美匹配的题目,我们需要注意两点:一、要处理好负边的情况。二、要注意N和M不一定相等。对于第一点的处理,我见过的有两种处理方式:①将所有边都初始化成负边,这样当做N-M之间所有的边都是存在的去进行匹配,如果最后发现边权为正的匹配数为N的话就是有解的,否则无解。②将为负值的边视为不存在,并且在KM算法过程中,如果发现当前状态不能再进行增广,则无解。对于第二点的处理,我见过的有些AC的程序也没有注意到这个问题,如果对这一点不加处理的话,如果出现N>M的数据并且是用第①种方式去处理第一点的话,程序会陷入死循环。另外,这个题让我不解的是,现在网上可以搜到的K 阅读全文
posted @ 2011-10-05 03:00 Staginner 阅读(378) 评论(0) 推荐(0)
  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 阅读(363) 评论(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 阅读(308) 评论(0) 推荐(0)
摘要: HDU_1853首先,如果要保证图有环,并且环之间没有交点的话,那么必然每个点的出度和入度都应为1,因此我们可以把一个点拆成两个点,分别表示出度及入度,然后去找拆点后构成的二分图的完美匹配。对于怎么判断原图是否能构成完美匹配,我暂时想到了两个思路:①在用KM算法之前先用匈牙利算法求最大匹配,如果最大匹配数为N,那么就一定会存在完美匹配。②我们可以从KM算法的slack变量入手,每一次更新slack,都是在尝试进行新一轮的增广,并且会把更多的原本不在交错树中的点加入进来,当把所有可以加到交错树中点都加入之后,slack就不会再进行更新。换句话讲,如果slack不再更新,那么一定是把所有可以加到交 阅读全文
posted @ 2011-10-04 19:40 Staginner 阅读(338) 评论(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 阅读(328) 评论(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 阅读(306) 评论(0) 推荐(0)
  2011年10月3日
摘要: POJ_3678这是一个2-SAT的问题,很容易能够看出核心变量就是x[i],剩下的工作就是依c的值以及符号分析清楚各个x[i]之间的制约关系。#include<stdio.h>#include<string.h>#define MAXD 2010#define MAXM 4000010int first[MAXD], next[MAXM], v[MAXM], e, N, M;int dfn[MAXD], low[MAXD], cnt, ins[MAXD], s[MAXD], top;int color[MAXD], col;char oper[][5]={" 阅读全文
posted @ 2011-10-03 22:37 Staginner 阅读(233) 评论(0) 推荐(0)
摘要: POJ_3207这是一个2-SAT的问题,首先我们要找到核心的变量,我们可以观察到,只有连成的线具有要么在内、要么在外的这样的逻辑关系,因此我们可以把连成的线当做核心变量。接下来我们需要做的就是去分析,什么情况时两条线才会产生相互制约的关系。为了方便描述,我们不妨把两条线分别记作<i1,i2>(i1<i2)、<j1,j2>(j1<j2)。不难发现,当出现j1>i1&&j1<i2&&j2>i2或者i1>j1&&i1<i2&&i2>j2的情况时,两条线会相互制约, 阅读全文
posted @ 2011-10-03 20:20 Staginner 阅读(316) 评论(0) 推荐(0)
摘要: POJ_2749一开始没有想到去二分距离,看了别人的报告之后恍然大悟。这是一个2-SAT的问题,首先我们要去找到核心变量,可以看出每个牛的有着要么和S1相连,要么和S2相连的逻辑关系,因此可以把奶牛看做核心变量,并用2*i表示第i个奶牛和S1相连,用2*i+1表示和S2相连。首先,我们要喜爱和憎恨的关系转化成边。如果i和j相互憎恨,那么如果i连S1,那么j必然连S2,如果i连S2,那么j必然连S1,反过来也是一样的。于是我们需要连4条边,分别是i->~j、~i->j、j->~i、~j->i。对于喜爱的关系,同理也需要连4条边,分别是i->j、~i->~j、j 阅读全文
posted @ 2011-10-03 19:11 Staginner 阅读(460) 评论(9) 推荐(0)
摘要: POJ_2723一开始还是没有抓住2-SAT题目的核心,不会构图。其实2-SAT最重要的一点就是要找出0-1的关系,即一个东西要么选要么不选,或者要么选这个状态,要么选那个状态,这个物品就应是核心的变量。显然这个题目只有一个物品满足这一点——钥匙,对一把钥匙来讲,我们要么用它要么不用它。找到核心变量之后,剩下的工作就相对轻松了。首先,对于一对钥匙AB,我们可以得到这样的结论:如果选A,那么一定不选B,如果选B,那么一定不选A,于是就能够连两条边A->~B,B->~A。其次,对于能够开一扇门的两把锁CD,我们可以得到这样的结论:如果不用C开C锁,那么就必然要用D开D锁,如果不用D开D 阅读全文
posted @ 2011-10-03 14:13 Staginner 阅读(229) 评论(0) 推荐(0)
上一页 1 ··· 68 69 70 71 72 73 74 75 76 ··· 85 下一页