04 2013 档案

摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087方法:设F(ni)为当第ni个作为一个递增非连续字段最后一个元素的时候,该字段累加的最大值,设第x个元素的值为v(x)。然后建立状态转移方程:F(ni) = max({F(ai)+v(ni) | v(ai)<v(ni) and 0<=ai<ni}),对每一个这样的第ni个元素做这样的处理,最后的解为:max( F(x) | 0<=x<=n).代码实现的时候会有一个优化,那就是对于这样的情况:1 2 3 4 5 9 8考虑那个8的时候,是从9往前探寻所有小于8的数, 阅读全文
posted @ 2013-04-26 17:45 kbyd 阅读(186) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1881方法:设F(i,n)为当考察到第i个bg,在第n天的时候,能获取的最大快乐,当然该bg要对一天获得的快乐度产生影响,则必须要第i个bg的结束时间i_deadLine小于等于n,已经当天减去其持续时间i_duration,设每个bg的快乐度是i_pleasure,bg的数量为count,状态转移方程如下: F(i,n) = Max(F(i,n-i_duration)+i_pleasure, F(i,n)), n<= i_deadLine and n-i>=0;对每一个bg都做以上的考 阅读全文
posted @ 2013-04-26 15:56 kbyd 阅读(415) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1903方法:设F(currency_type,n) 为在第n天,如果要持有currency_type的钱,那么以该currency_type为单位能获得的钱多是多少。设0代表加元,1代笔美元,p_rate为美元用加元表示的价格,c_rate表示佣金收取率,就是手续费,防过度投机的。状态转移方程是: { Max(F(0,n-1),F(1,n-1)*p_rate*c_rate), currency_type == 0;F(currency_type,n) = ... 阅读全文
posted @ 2013-04-26 15:08 kbyd 阅读(231) 评论(0) 推荐(0) 编辑
摘要:View Code #include<iostream>//#include<math.h>//#include<algorithm>//#include<queue>//#include<stack>using namespace std;int const MAX =0x3f3f3f3f; struct state{ int remainDriving; int divingDist; int fDist; double time;};int main(){ int totalLengh; int chargerCount,dri 阅读全文
posted @ 2013-04-26 14:34 kbyd 阅读(173) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421方法:首先对于这些重量乱序的物品,需要排序来贪心初始化然每件物品在选择的时候,都是选择与其重量最接近的。然后建立状态转移方程,设F(k,i)为当选择第i物品的时候,从中选择k对物品的最小疲劳度,staff[i]为排序好了的物品中第i个的重量,方程如下: { (taff[2] - staff[1])^2, k==1 and i==2;F(k,i) = Max( (staff[i]- staff[i-1])^2, F(k,i-1) ), k==1 and i>=3; ... 阅读全文
posted @ 2013-04-23 20:27 kbyd 阅读(166) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4472方法:该题目不是最优解类型的dp,属于排列组合的dp,根据题目建好模型后得到如下状态转移方程: { 1, n==1;F(n) = Sum{F((n-1)/x)| (n-1)%x == 0 && 1<=x<=n-1}, n>=2; }最终F(N)为解。感谢:简单题。代码:View Code #include<iostream>#include<math.h>//#include<algorithm>//#include< 阅读全文
posted @ 2013-04-23 15:55 kbyd 阅读(142) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4526方法:设F[x,m]为在m分钟,已经累积走了x人所花了多少钱最少为多少,设在第i分钟可以累计走的最大人数是c(i),出租车在第i分钟每人需要的额外等待价格p(i),有剩余作为数量a(i),出租车基础价格p,学生总数totalStdCount,总时间为M,状态转移方程是:F[x,m] = Min{ F[i,m-1] +(x-i)*p(m)+p | 0<=i<=c(m-1) and i<=x<=Min(c(m-1)+a(m) , totalStdCount)and x-i 阅读全文
posted @ 2013-04-23 15:33 kbyd 阅读(187) 评论(0) 推荐(0) 编辑
摘要:题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4502方法:设F(m)为在第m天累积到的工资,第i个工作开始时间为bi,结束时间ei,工资为si,总共天数M。建立状态转移方程: { 0, m==0;F(m) = Max(F(bi-1)+si,F(m)); m>=ei, F(m), m<ei; }.最终F(M)为问题的解。通过2重循环循环来实现对工作的处理顺序是按照工作的结束时间来的,这样就不需要排序。感想:需要动点脑筋建下模。代码:View Code #include<iostream>using namespace s 阅读全文
posted @ 2013-04-23 14:59 kbyd 阅读(150) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1157方法:通过像快速排序那样进行一个划分,划分只对一个部分进行处理而不是像快速排序那样对两个都处理。当随机选择一个元素进行了划分后,开划分的位子k在哪里,如果把x-th元素的x等于k,则直接返回,小于,就在前面一个部分递归下去找地x-th小的元素,否则,x-=k,在后面一个部分去找。在该题目中x为n/2+1.感谢:时间复杂度接近o(n),这是根据概率分布计算出来的,以后要学会其证明,包括快速排序的证明。代码:View Code #include <iostream>#include & 阅读全文
posted @ 2013-04-23 13:59 kbyd 阅读(230) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084方法:是对于每一个塔中第x行第y个位子的地方,设其所累加的最大和F(x,y),当前位子本来就有的数字current(x,y),当前位子处于的行的元素个数cx.则状态转移方程为: { Max(F(x-1,y)+current(x,y),F(x-1,y-1)+current(x,y));F(x,y) = 1, x==1 and y==1; 0, x<0 or y<0; } 感想:简单题。View Code #include<iostream>using n... 阅读全文
posted @ 2013-04-22 14:38 kbyd 阅读(137) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571方法:建立状态转移方程,设F(x,y)为当前走到获得的最大幸运值,current(x,y)为当前位置本来就具有的幸运值,则方程为: { 0, x<1or y<1;F(x,y) = Max( {F(x-1,y)+current(x,y)}U{ F(x,yi)+current(x,y) |(yi%y==0 and yi!=y)oryi+1==y} ); current(1,1), x==1 and y==1; }在自底向上的时候,需要考虑一个位子列数c的小于... 阅读全文
posted @ 2013-04-22 14:02 kbyd 阅读(165) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391方法:建立状态转移方程,设F(x,y)为走到x,y点已经获得了的最大黄金数量,curent(x,y)为该点本身具有的黄金数量,则 { 0 , x<1|| y<1;F(x,y)= Max(F(x-1,y)+current(x,y), F(x,y-1)+current(x,y),F(x-1,y-1)+current(x,y));//因为每一个位置最多可以从3个方向到达。 current(1,1), x==1 && y==1; }感想:适合dp入门练习。代码:View.. 阅读全文
posted @ 2013-04-22 13:44 kbyd 阅读(131) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2616方法:深搜树中每一个状态节点包含的信息为:使用武器的标号,怪物还剩余的生命值,以及该节点处于的层数也就是使用了多少个武器。然后分别以每一个武器作为树的根节点以实现暴力深搜。深搜的过程中用到一个很基本的剪枝方法,那就是在搜索过程中维护一个当前已经获取的最优解,该题目中为当前为了消灭怪物使用武器数量最下那个数量MinCount,然后每一个次搜索的时候发现如果再继续搜索很得到次于当前最有解的解,是不会被选择的解,于是再搜索便无意义,所以就剪掉,在该题目中,如果发现当前节点的层数已经大于当前MinCo 阅读全文
posted @ 2013-04-21 21:51 kbyd 阅读(234) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2614方法:就一个很简单的递归深搜,当探寻到一个节点A的时候,表明其可以解答一个题,于是先设置其解答的题目个数是1,然后去以此探寻其子节点,其子节点就是其下一个可以解答的题,可能有多个可以解答的题,于是就用多个子节点,分别递归去计算每一个个子节点下去能接答多少题,去能解答题目数量最多的一个状态子节点的探寻结果和一开始就设置的1相加,得到从该A节点的结果。感想:简单题代码:View Code #include <iostream>#include <queue>#include 阅读全文
posted @ 2013-04-21 21:21 kbyd 阅读(214) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2611方法:和hdu 2610不一样,该题中要求的顺序除了根据长度外是根据数字大小而不是数字所在的下标,所以不像2610那样有现成的顺序在那里我们只需要去扫描就可以了,所以这里要使用优先队列,但如果对所有的状态都用优先队列来放的话,这会带来很大的时间开销所以,本程序的处理是, 1,将当前已经探寻到了状态维护在一个一般队列中,并且保证其入队出队顺序和题目要求一致。 2,当出来一个状态,准备去探索一堆新状态的时候,由于都是同一个状态探寻到的,所以它们携带的数组长度一样,所以这里只需要对大小排序。在由.. 阅读全文
posted @ 2013-04-20 14:40 kbyd 阅读(241) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2610方法:状态收索树中的每一个节点包含如下信息, A.当前数组中的个数。 B.当前数组中最后一个数在原数组中的位置。 C.一个指向 当前数组的指针在指针数组中为值得编号。由于每一个状态节点中的数组长度不定,所有都用int* 来动态为其分配空间。这样在进出队列的时候还可以减少副本开销。每一个状态节点在广搜探寻下一个节点的时候,先从自己当前数组最后一个数在源数组中的位置后第一个位置开始,以下标的顺序不重复地找寻大于等于当前数组最后一个数的数x 以及其下标i,然后,然后给新节点的数组中数字个数赋为... 阅读全文
posted @ 2013-04-20 14:15 kbyd 阅读(224) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612方法:其实就是从两个点分别探寻单源最短路径,两个点到同一个目标位置的最短路径都求出来,相加,然后找出到哪一个相同目标位置的最短路径之和最小即可,采用的模拟dijsktral算法。要注意的一个地方是,找到一个kfc后一定还要继续去找,而不是向其他广搜题那样就停止探寻了,不能有思维定势啊。实现方法为,初始的时候将两个源点到目标位置的距离设置为正无穷,然后分别用单元最短路径的算法模拟广搜并更新到目标位置的距离,最后在目标位置中找到最短路径之和最小的,由于正无穷和任何数之和都是正无穷,所以如果遇到不是 阅读全文
posted @ 2013-04-20 13:33 kbyd 阅读(158) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4528方法:地图输入接收完成后,扫面数组,把所有可以看到D和E的位置都标记了,d表示可以看到D,e表示可以看到E,b表示两个都可以看到,这一步放在广搜前的初始化里面。在广搜时,树中的每一个状态节点有3个信息,图中坐标x y,到当前有没有已经看到D getD,到当前有没有已经看到E getE,和当前使用的时间。探寻到一个状态节点,将不将其放入优先队列,从不从该节点开始广搜判断的依据为改状态所处位子是不是墙或D或E(题目要求不能穿过D或E)已经该状态有没有搜索过。判断一个状态有没有搜索过,主要由一个4维 阅读全文
posted @ 2013-04-18 18:33 kbyd 阅读(451) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175方法:在每一步都要维护4个信息,当前坐标,当前方向(垂直还是水平),当前已经折了多少次和携带的目标数字。根据这几个信息,在一步深搜索探寻下一步的时候,选择下一步的标准是:没有访问过 && (是可以走的路 || (不是路而是一个和目标数字相等的数 && 该位置就是目标位置))。整个算法的过程是:1.获取输入后验证是否可达,标准为: a.两个位子的数字必须相同。 b.两个位子的数字必须不能有0。 c.目标位置的直接周边4个必须至少有一个0.如果三个条件不能都满足,直 阅读全文
posted @ 2013-04-18 14:17 kbyd 阅读(261) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072方法:和1180一样,图中有些位置是所有的搜索路径都可以去走的,题中就是还原装置所在的位置。除此之外还有其他需要注意的地方。1.所有还原装置的位置都不能被设置为已经访问而不能再去访问,这和1180中的楼梯一样。2.一条收索路径经过一个还原装置后,不能再回到该还原装置,因为会产生环路,如下地图:2 1 4 12 1 0 3到从1行2列的1穿过1行3列的还原装置4到达1行4列的1时,由于还原装置的位置如上述第一点说的那样永远不会被设置为已经访问,所以在1行4列的1这个位置广搜的话,会探寻到还原装置 阅读全文
posted @ 2013-04-17 16:47 kbyd 阅读(152) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312方法:对探寻到的点的数目累加的时候,可以选择在刚探寻到一个点时对数目加1,也可以在一个新探寻到的点开始进行新一层探寻的时候对数目加1,即前者记录有多少个点进队列,后者记录有多少出。感想:第2次做的时候选择了第2种方法,两种方法都可以过,本代码使用第一种。代码:View Code #include <iostream>#include <queue>using namespace std;int rowsCount,columsCount;bool visited[25] 阅读全文
posted @ 2013-04-17 10:58 kbyd 阅读(194) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372方法:建模后的广搜是最基本的单位权值边单源最短路径。所以不需要使用优先队列,直接用普通队列来维护广搜即可。感想:基础题。代码:View Code #include <iostream>#include <queue>using namespace std;bool visited[9][9];char chessboard [9][9];int derection[8][2];struct cell{ int x,y; int currentSteps;};bool c 阅读全文
posted @ 2013-04-17 10:42 kbyd 阅读(148) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553方法:1.可以用对称的思想,即:如果N是偶数,则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和,最后再乘以2。如果是奇数,再单独计算一个在N/2+1这个位置的结果。 2.一个皇后如果放在一个位置,要把该位置对应的行列上的位置和以该位置为起点,从左下 和 右下45读的两个方向延伸穿过的位置都设置为不可再放。 3.在状态数中,在第i层为第i个皇后找位子其实就是在棋盘的第i行找。找不到就返回,否则修改棋盘,继续收索,直到第N层也搜索成功,此时给结果加1.感想:后期多看。代... 阅读全文
posted @ 2013-04-16 17:58 kbyd 阅读(242) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1180方法:此题和一般的地图广搜差不多,唯一的变化就是在楼梯那里,楼梯那里考虑的方式如下:1.根据楼梯的初始状态和当时达到楼梯旁边的位置时走的时间来确定这个时候楼梯的方向。2.再根据当时前进的方向 和 当时楼梯的方向确定走过去要多少的时间,是用1还是2.3.不管走过去后时间是多少,如果过去后发现是障碍物或已经去过了,则该位置不进队列,不考虑从该位置开始的一个广搜。4.如果可以从楼梯过去的那个位置进行广搜,那么该位置开始广受的广搜索不能再经过刚才才经过的楼梯,要判断这个信息不能简单通过设置visite 阅读全文
posted @ 2013-04-16 17:37 kbyd 阅读(187) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1242方法:将几个r去找一个a的哪个r先找到a 的问题转换成 一个a去找多个r看先找到哪个r问题,可以使用优先队列,建模成一个单源最短路径来解答。但是本程序实现中没有用优先队列,而是就一班的广搜,由于有多个目标,题目要求找到到目标最快的一个目标,所以就在广搜到每一个目标的每一个时候,用达到其的时间用比较的方式去更新当前维护的一个最小到达时间。感想:要换角度思考问题.View Code #include <iostream>#include <queue>using names 阅读全文
posted @ 2013-04-16 14:03 kbyd 阅读(156) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1026方法:状态搜索树的节点保存4个东西,坐标x,y,当前总共耗时,其最短路径前驱指针。当前节点根绝自身情况计算出耗时,然后加上前面一个节点累计的耗时得到当前到该节点使用的耗时,配合使用用当前累计时间排序的优先队列使用dijkstra算法原理。感想:图论dijkstra算法,熟悉其证明方法。代码:View Code #include <iostream>#include <queue>#include<stack>using namespace std;int r 阅读全文
posted @ 2013-04-16 13:47 kbyd 阅读(171) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016方法:建立好状态树,状态树中的每一个节点有4个变量,即 1,当前状态为构造最终目标状态使用了什么数字的数组,后文称usedNums。 2,当前状态为构造最终目标状态还可以使用的数字的数组,后文称avaliableNums。 3,当前状态为构造最终目标状态已经构造了多大的长度,也就是该状态节点在树中的层数,后文称layer。 4,目标状态的长度。每一个状态节点使用当前所在层数-1作为下标,取出已经构造好了的usedNums的最后一个数字x。... 阅读全文
posted @ 2013-04-15 14:44 kbyd 阅读(149) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010方法:由于该题搜索的目标状态是准确的状态,即目标状态要求在到达的时候时间刚好是那么多,不能提前到达也不能延后到达,这和时间要在规定时间内或者求最小时间不一样,所以不用广搜用深搜。在深搜的时候要注意几个问题,1.从一个顶点开始向四个方向深搜的之前(要是这个方向可以走的话),要把该顶点设置为不再可走(将该点设置为wall),这样来实现走过的路不能回去再走。而当该顶点四个方向深搜完成后,如果没有找到目标状态,则需要将其还原为可以走,因为有其他顶点开始的深搜会走到该点,而此时该点在这个状态下还没有走过 阅读全文
posted @ 2013-04-15 13:37 kbyd 阅读(173) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1224方法:根据输入数据建立好的图(图中每个顶点会纪录当前累计获取的有趣度和自己本身的有趣度)是不会有回路的有向图,所以可以是用拓扑排序,由于题目输入数据就定下了第一个定点是起点,所以代码中直接从第一个顶点开始扫描的顺序就是拓扑排序的顺序,程序中不需要在进行拓扑排序。按该顺序每访问一个点,就松弛其所有的边,并设置其在最长(短)路径中的前驱。感想:通过聚集分析,时间复杂度是o(v+e).代码:View Code #include<iostream>#include<algorithm 阅读全文
posted @ 2013-04-15 01:11 kbyd 阅读(233) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790方法:用建立有向图的方式建立无向图,调用dijkstra的时候,在优先队列里面的比较以及对边的松弛,都要依次根绝两种权值进行比较。感想:简单题。代码:View Code #include<iostream>#include<queue>//#include<algorithm>using namespace std;int const MAX =0x3f3f3f3f;int cityCount,roadsCount;struct Arc{ int vetex 阅读全文
posted @ 2013-04-15 00:38 kbyd 阅读(194) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874方法:使用邻接表,将两个点之间的所有边都用一条最小费用的边来代表。然后用这些边来建立图并调用DIJKSTRA,最后判断到目标定点的距离是不是正无穷,不是正无穷的值就是最小路径的费用权值。感想:用数组每次排序没有在选择的点的方法来模拟优先队列不好,以后要用堆来模拟。代码:View Code #include<iostream>#include<algorithm>using namespace std;int const MAX =0x3f3f3f3f;int cityC 阅读全文
posted @ 2013-04-15 00:33 kbyd 阅读(194) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269方法:就是求强连通分支个数,为1就可以。感想:《算法导论》上额强连通分支部分的定理证明有必要多理解。代码:View Code #include<iostream>#include<algorithm>using namespace std;//int const MAX =0x3f3f3f3f;int const MAX = 10005;struct Arc{ int vetex; Arc* nexttArc;};struct Node{ int x; Arc* fir 阅读全文
posted @ 2013-04-13 23:33 kbyd 阅读(189) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647方法:该题需要贪心,即工资最低的直接取888的基本工资,而A的工资>B的工资 则A只比B多1. 实现方法是将输入的工资大于关系转换成小于关系,然后利用小于关系建立有向图的边。如输入a b(表示a工资比b高),则建立一个b到a的有向边(表示b工资比a低。建好图后,利用拓扑排序的方式,先把最开始的入度为0的顶点的工资设置为最低工资,删除该顶点后将其指向的节点 工资在刚才那个入度为0的基础上加1,入度减1,如果入度减少为0了,又同样迭代,本代码使用队列来实现该中迭代,有点类似广搜的方式。在拓扑 阅读全文
posted @ 2013-04-13 23:27 kbyd 阅读(290) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285方法:以后比赛名次以前到后的有向边建立好有向图,然后开始拓扑排序。排序的方式为将入度为0的点压入优先队列,优先弹出其中序号最小的出队列,输出,然后扫描其所有指向的端点,将端点的入度减1,如果减少为0后,也同样压入优先队列,如果优先队列有多个入度减少为0的点,则下一次就又再优先弹出序号最小的,以此循环。最终比赛名次排出。感想:该题重点在于考察在拓扑排序的时候,如何才能在出现了两个入度为0的端点时,要优先输出的是序号比较小的。代码:View Code #include<iostream> 阅读全文
posted @ 2013-04-13 23:06 kbyd 阅读(147) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301方法:直接建模后用prim算法感想:简单题代码:#include<iostream>#include <queue>using namespace std;struct fuckNode{ int index; int distance;}; struct cmp{ bool operator ()(fuckNode x, fuckNode y) { return x.distance> y.distance; // x小的优先级高 }}; int... 阅读全文
posted @ 2013-04-13 22:15 kbyd 阅读(163) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879方法:在接收输入的时候,如果两个地方已经存在道路,则将道路上的点加入到并查集,同时,该边在后期计算最小生成树时,不予考虑。不予考虑的方式就是不把该边纪录在邻接矩阵里面。而道路还没有修建的两个点,在考虑的时候是只把该两点间的最小修建费用作为权值的边纪录在邻接矩阵里面。然后把矩阵中的边排序,准备开始调用kruskal算法。在调用该算法往集合添加轻边的时候,要考虑该边的两个端点是否已经因为前面添加的轻边而已经在生成树里,这个时候用到并查集。由于之前已经添加已修建的道路的两个顶点在并查集中,所以该两点 阅读全文
posted @ 2013-04-13 22:11 kbyd 阅读(208) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1875方法:在往优先队列中加入定点的时候,判断当前队列出来的点探寻到其时到其的距离是否满足限制条件,不满足,该顶点就不进优先队列,相当于该边在图里不存在。感想:简单题。代码:View Code #include<iostream>#include<queue>#include<math.h>using namespace std;int const MAX =0x3f3f3f3f;struct Node { int x; int y; double distanc 阅读全文
posted @ 2013-04-13 21:30 kbyd 阅读(136) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162方法:由于没两个点都有边,且边的代价要算,因此用kruskal算的话光光是算边的代价实践复杂度就是o(v^2),所以用prime的.感想:最简单基本赤裸裸的最小生成树。代码:View Code #include<iostream>#include<queue>#include<math.h>using namespace std;int const MAX =0x3f3f3f3f;struct Node { double x; double y; doubl 阅读全文
posted @ 2013-04-13 21:19 kbyd 阅读(175) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325方法:建好有向图后,要判断是否是树,关键判断两点,即1,是否只有一个唯一的根节点;2,是否从根到任何节点都有且仅有一条路径。这就要就图中入度为0的定点有且仅有一个,其他的定点入度只能是1.感想:简单题。代码:View Code #include<iostream>using namespace std;const int MAX = 100005;int indegree[MAX];int main(){ int a,b; int i=0,j=0,kk=0; memset(i... 阅读全文
posted @ 2013-04-13 19:04 kbyd 阅读(136) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1311方法:把所有父子关系看作是一个以父为起点以子为终点的有向边来建立有向图,图中所有的定点要有4个数据,即自己名字,自己年龄,自己比父亲小的岁数,和指向自己第一个儿子的指针。其中,初始的时候,除了那个最高祖先的“自己年龄”已经确定外,其他人的年龄均不确定,均需要在广搜的时候计算,计算的方法是根据父亲的“自己年龄”减去自己的“自己比父亲小的岁数”。由于初始的时候最高祖先的“自己年龄”已知,所以,在广搜的循环不变式中,每一个子孙的年龄均可计算出来。在接受输入并建立边的时候,对于每一个“父亲-儿子-儿子 阅读全文
posted @ 2013-04-13 18:37 kbyd 阅读(265) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342方法:把所有master-prentice的关系都看一条以master为起点prentice为终点的有向边来建立有向图,然后检测有向图中是不是存在回边。检测的方法是通过染色的白灰黑方式进行深搜,看有没有出现回边,搜索过过程中,如果通过一个边探索到了灰色的点,则该边为回边。具体参考《算法导论》一书上的相关定理证明。感想:简单题目,但后期需要频繁重温代码。代码:#include<iostream>#include<queue>using namespace std;bool 阅读全文
posted @ 2013-04-13 17:58 kbyd 阅读(184) 评论(0) 推荐(0) 编辑
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1181方法:以所有咒语看做一条起点为首字母,终点为末字母的有向边来建立有向图。然后在图中判断目标路径是否存在,判断的方法是 :如果目标路径的起点和终点不都在图中出现,则直接得出不存在该路径,否则广搜索来判断目标路径是否存在。感想:简单题目,但后期需要频繁重温代码以熟悉广搜代码的写法。该题使用的是邻接矩阵。代码:View Code #include<iostream>#include<queue>using namespace std;bool matrix[26][26];b 阅读全文
posted @ 2013-04-13 17:43 kbyd 阅读(227) 评论(0) 推荐(0) 编辑