摘要: 呵呵,这道题目的话,跟之前那道计算路径程度有点区别给你多个路径,让你求出哪些节点被作为最近公共祖先,并计算被作为最近公共祖先的次数首先,读入数据有点麻烦,按代码中那种方法,还蛮方便的其次就是,需要找出根节点,再进行深度优先搜索,这是很求路径长度唯一的区别,计算路径的时候,从任意节点开始,并不影响计算路径的长度但是,此题目中,我们要保证每一个最近公共祖先都是正确的,为什么这么说呢?因为,在计算路径的时候,其实只是一种相对的情况,即,这已遍历的节点中,相对的某个节点是最近公共祖先,没有一种严格性而此题就是要求最近公共祖先,所以必须先找出根节点,即入度为零的节点,这个也很好理解具体的,见之前的258 阅读全文
posted @ 2011-05-08 23:06 枕边梦 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 今天效率还不错,再接再厉^-^总得来说,这道题目不难,但悲剧的是,我一开始理解错题意了题意:1)n个队列,n个立方体。 2)初始化时候每个队列有一个立方体。 3)两个操作:m x y:将x所在的集合放到y所在的集合里面,说白了,就是将y所在集合放到x所在集合后面 c x:问x立方体下面有多少个立方体呵呵,发现,其实,每次“真正”执行find()的时候,实际上都是对Union的进一步维护,只有进行一次与节点x有关的Union时,才会对x维护,而且,维护过后,x节点之上的节点也会同时被维护,并且直接挂到根节点上,这意味着之后对另一些点的维护并不会影响到已维护了的节点还有就是那个计算,节点x之下的元 阅读全文
posted @ 2011-05-08 20:54 枕边梦 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 这题呢,还好吧,主要是在求相对坐标的时候,有点抽象,不过还是可以理解的,画个坐标对一对就知道了还有就是,并查集的应用,因为要在某一个查询位置判定该点是否已经知道具体坐标,问题转化为俩点是否属于同一个集合,属于同一个集合,则相对于根节点的坐标都知道了,直接求曼哈顿距离,否则无法求出距离代码中附带了解释:#include<stdio.h>#include<string.h>#define MAXN 40010int n,m,k;struct node{ int x,y,f;}f[MAXN];struct node1{ int a,b,d; char ch;}e[MAXN]; 阅读全文
posted @ 2011-05-08 16:50 枕边梦 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 这题目跟杭电的2586很像,呵呵,应该说,本来这道是先做的,但是LAC不会,所以就先做了那道基础题好悲剧呀,在代码里面加了一个测试输出,结果忘记删了,还固执的贡献了几个WA,题目中给的方向是没用的,读进来就可以因为代码基本一样,具体解释见hdu2586#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXN 40010struct node{ int vex,next,dis;}g[MAXN*2],q[10010*2];int f[MAXN],first[MAXN],head[MAXN 阅读全文
posted @ 2011-05-08 13:14 枕边梦 阅读(151) 评论(0) 推荐(0) 编辑
摘要: View Code #include <iostream> #define MAXN 40010 using namespace std ; struct Graph { int vex , next , dis ; }; Graph g[MAXN * 2] , Q[400] ; int first[MAXN] , head[MAXN] , set[MAXN] , away[MAXN] , n , m ; bool visited[MAXN] ; //first[v]用来查找节点所在边,即g[first[v]],同时, g[i].next记录与节点v连接的节点,这俩个记录十分的关键 阅读全文
posted @ 2011-05-08 11:35 枕边梦 阅读(1197) 评论(0) 推荐(0) 编辑