2012年8月20日
摘要: POJ_1986 没有太仔细看题意,dicuss里面说是查询树上两点间距离我就照办了,由于自己比较懒,一直没有学习和LCA相关的算法,所以只好复习一下前面写过的树链剖分和link-cut-tree了。View Code // 树链剖分#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 40010#define MAXM 80010int N, M, first[MAXD], e, v[MAXM], next[MAXM], w[MAXD], sum[4 * MAXD];int q 阅读全文
posted @ 2012-08-20 23:54 Staginner 阅读(421) 评论(0) 推荐(0) 编辑
摘要: POJ_2175 据说这个题目裸着做费用流会超时,不过实际上看完这个题目还是不难发现更好的思路的,因为题目又没要求要最优解,而是得到一个更优的解,那么如果在原图中能够找到一个总费用为负的回路的话,那么沿这个回路流量增加1就能够在不改变原始总流量的基础上使总费用变得更低,于是我们只要试图去找这样一个负圈就可以了。 如果用的SPFA的话,在一个点入队次数大于顶点数时就可以判断有负圈存在了,但这时刚刚入队的这个点却未必是负圈上的,但我们可以记录下来每个点被更新的前一个点,沿这个路径不停地回溯去找,直到发现找到的这个点在之间已经遇到过了,那么找到的这个点就一定是某个负圈上的点了。最后以这个点为基础.. 阅读全文
posted @ 2012-08-20 18:13 Staginner 阅读(551) 评论(1) 推荐(0) 编辑
摘要: SGU_185 这个题目被内存卡的严重头晕…… 其实思路还是满直观的,由于要两条路不相交,只要用网络流就行,再加上要两条最短路,那么就最小费用最大流,最后看两条路的费用和是不是最短路的两倍即可。但如果裸着这样写,由于无向边相当于两条有向边,不好意思,内存爆了……开小点吧,不好意思,RE了…… 晕……那还是换网络流写吧,这样少个记录费用的数组,可以先用dij从1开始搞遍最短路,再从N开始搞遍最短路,再遍历一遍所有边就知道哪条边是最短路上的边了,而且还知道了这条边的方向,那么根据这些最短路上的边组成的图做最大流就可以了,最后看总流量是不是为2。 当然敲到这里就发现了省内存的方法,只要先找到... 阅读全文
posted @ 2012-08-20 12:12 Staginner 阅读(463) 评论(0) 推荐(0) 编辑