摘要: 该题有两种输入1、P A B X 。表示A到B的距离点明了为X:A-B==X,等价于A-B<=X&& A-B>=X (B-A<=-X)。于是得到两条边(A,B,X)和(B,A,-X)。以前我很纠结A-B<=X是建成(A,B,X)呢,还是(B,A,X)呢,今天我实践了一下,发现都无关紧要,关键是接下来的所有边,你都得按照这个顺序来就是了!2、V A B 。表示A到B的距离最少为1:即A-B>=1,等价于B-A<=-1,得到边(B,A,-1)。最后再从原点向所有点引一条边权为0的边(S,i,0) i=1->n。图建好了,用SPFA求解即可, 阅读全文
posted @ 2011-08-02 23:24 Accept 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 题目大意是在一棵树中,通过提问的方式找出任意两点间的最短距离。对每颗树的提问次数可高达1W次。分析:此题高达4W多个点,4W多条边,还有如此高的提问次数,针对题目次数这么多,我们容易想到将每两个点的距离都找出来,以后你问一个我直接作答。而且更容易想到的是floyd算法,可是我们注意到节点高达4W。肯定超时!我们要注意这是一棵树,在一棵树中,两个节点通过公共祖先而互达的那条边一定是最短的。那么问题便转化为了求公共祖先。利用LCA的离线tarjan算法,我们可以轻松的找到任意两点间的祖先,同时在深度遍历的同时,记录所有点到root的距离。最后我们只要输出该两点离root的距离之和减去两倍的祖先到r 阅读全文
posted @ 2011-08-02 22:21 Accept 阅读(381) 评论(0) 推荐(0) 编辑
摘要: lca算法是用于在一个树或者一个图中,找出两个节点的公共祖先的算法。有什么用呢?举一个例子:在一棵树上,当我们随便添加一条边的时候,那么就会在原来的树上形成环。如何把这个环找出来呢?嘿嘿,lca算法便是了!lca算法是运用需要一个预热的过程,简单的说,就是他需要一棵树或者一个图中节点的每个点的深度和父节点。呵呵,简单啊,DFS就是了。接下来根据已知的信息,不断的将两个节点往回迭代,直到找到了同一高度,同一个父节点。这个节点便是他们两点的公共祖先了,而这个过程经过的边加起来,便是我们要找的环!1、DFS(略)2、Int lca(int u,int v) //lca算法,在某一个图中,找出u,v的 阅读全文
posted @ 2011-08-02 14:11 Accept 阅读(2110) 评论(0) 推荐(0) 编辑