摘要: Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html基本概念:1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点。2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。3.点连通度:最小割点集合中的顶点数。4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图。5.割边集合:如果有一个 阅读全文
posted @ 2012-02-13 11:42 E_star 阅读(503) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1523求一个无向图的割点,以及输出删除该割点后形成的连通块数(删掉一个割点后会形成两个连通分块)今天脑子被驴了。晕晕的。。。这样一个模板题整了一上午,各种粗心错误,敲了好几遍,现在看到tarjan就恶心。。。View Code #include <cstdio>#include <cstring>#include <iostream>#define maxn 1007using namespace std;struct node{ int v; int next;}g[maxn*4];int low[ma 阅读全文
posted @ 2012-02-13 11:41 E_star 阅读(291) 评论(0) 推荐(0) 编辑
摘要: Tarjan算法(有向图强连通分量问题)转载自:http://www.byvoid.com/blog/scc-tarjan/zh-hans/[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时 阅读全文
posted @ 2012-02-12 19:47 E_star 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 做了一些树形DP实在不想做了看到von在玩tarjan算法,好像放假之前看过关于rmq 以及tarjan算法的说明只是没具体弄明白。今天看了一下von分享的资料不错。找了一个模板题就当tarjan算法的模板吧http://acm.hdu.edu.cn/showproblem.php?pid=1269判断是否为强连通图 bcnt == 1只有一个强连通分量且为自己 bcnt >1 存在多个强连通分量View Code #include <cstdio>#include <iostream>#include <cstring>#include <ve 阅读全文
posted @ 2012-02-12 19:46 E_star 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 2、 RMQ算法(转载)对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大且查询很频繁时,该算法也许会存在问题。本节介绍了一种比较高效的在线算法(ST算法)解决这个问题。所谓在线算法,是指用户每输入一个查询便马上处理一个查询。该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询。ST(Sparse Table)算法是一个非常有名的在线处理RMQ问题的算法,它可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。首先是预处理,用动态规划(DP)解决。设A[i]是要求区间最值的数列,F[i, j]表示从第i个数起连续2^j个数中的 阅读全文
posted @ 2012-02-12 16:44 E_star 阅读(366) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1520学校举行周年纪念日party,要求是直接上司和下属关系的员工不能同时参,给出树形关系图,求怎样邀请的人的列表是的总rating最大。每个人都对应着一个rating首先建立无向图,然后以以1节点为根节点,dfs从叶子往根推。。dp[i][0] 表示i节点不邀请是的最大rating,dp[i][1]表示i节点要请示最大的rating转台转移方程dp[i][0] += max(dp[son[i]][1],dp[son[i]][0]); i没被邀请,所以他的孩子可以邀请也可以不邀请,我们只要最大rating.. 阅读全文
posted @ 2012-02-11 15:56 E_star 阅读(380) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2196看了很长时间都没看懂,解题报告也是乱的让人头疼。最后问了一下von的思路,然后看了看代码终于明白了。这题真的很难。首先按所给信息建图,建立的是有向图。然后将1视为根节点第一遍dfs从叶往根递推,求出每个点所能到达的最远距离和次远距离,只有当这一个点有多条分支时才存在次远距离(注意这里是有方向);该点所能到达的最远距离可能是第一遍dfs搜到最远距离,也有可能由父亲节点+父亲节点与该节点的距离所得。所以第二遍dfs从根节点1出发往树叶边遍历。f[i]存最长距离,l[i]存次长距离,dp[i]存由父亲节点延伸 阅读全文
posted @ 2012-02-11 14:06 E_star 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 树形DPhttp://acm.hdu.edu.cn/showproblem.php?pid=2196√向下搜一遍,向上搜一遍http://acm.hdu.edu.cn/showproblem.php?pid=1561√对每一个节点进行一次背包,好题啊,两个DP树形和背包结合的http://acm.hdu.edu.cn/showproblem.php?pid=1011√这道是当年省赛的压轴题,但是感觉和上一道差不多,一样的难度,唯一不同的就是这个是无向图(我由于思维惯性拿来当单向图作,纠结了好久。。。)树形+背包+临街表下边是从天涯空间里找出来的练习http://acm.pku.edu.cn/J 阅读全文
posted @ 2012-02-11 10:11 E_star 阅读(284) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1033给两点,然后又第二个点画线,单位长度为10,每次旋转90度,这里的陷阱是确定了顺时针后,逆时针要根据顺时针来确定。。View Code #include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#define maxn 207using namespace std;int main(){ //freopen("d.txt","r" 阅读全文
posted @ 2012-02-08 18:32 E_star 阅读(203) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1561同hdu1011只是这里做的小处理是将0点加入,将原来的森林变成了树,这样就可以按照树形dp展开来做了。。dp[i][j]表示从i点往后占领j个城市所获得的总的最多宝物dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[son[i]][k])View Code #include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cst 阅读全文
posted @ 2012-02-08 16:13 E_star 阅读(251) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1011dp[i][j]表示在第i个位置放j个trooper,然后又该节点分配给子节点后所能得到的最大brains;状态转移方程dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[son[i]][k]);从叶子节点往根节点递推。。。View Code #include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <cstring># 阅读全文
posted @ 2012-02-08 14:53 E_star 阅读(218) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1198原来看解题报告做过的一道题,现在拾起来再做感觉还是有点难度,慢慢想想也就思路清晰了。首先发现通道只要相碰就能连接。结构体记录是否能够连接,把能连接的用并查集归为同一集合,不能连接的则属于不同的集合。最后统计几何数就欧了。。、View Code #include <cstdio>#include <cstring>#define MAXN 59struct node{ int up; int down; int left; int right;};node tagp[11]={ { 阅读全文
posted @ 2012-02-07 19:26 E_star 阅读(185) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=10312012 新年A的第一道题目。纪念一下。水题: 有m个东西要n个人评价给分,求出k个人的评价给分最高View Code #include #include #include #include using namespace std;#define MAXN 1000struct node{ double val; int num;}tagp[MAXN];bool cmp1(node a,node b){ return a.val>b.val;}bool cmp2(int a,int b){ ... 阅读全文
posted @ 2012-02-07 16:50 E_star 阅读(170) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1021按常理计算f[n]的时候会出现越界。。所以利用模运算f[n]=(f[n-1]+f[n-2])%3=(f[n-1]%3+f[n-2]%3)%3;View Code #include <cstdio>#include <cstring>#include <iostream>using namespace std;long long f[1000002];void init(){ int i; f[0]=7;f[1]=11; f[0]%=3; f[1]%=3; for(i= 阅读全文
posted @ 2012-01-02 21:26 E_star 阅读(204) 评论(1) 推荐(1) 编辑
摘要: int a=4;char s;s=s+'0';总是忘记。。。。 阅读全文
posted @ 2012-01-02 20:47 E_star 阅读(211) 评论(1) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1018一天了,看不下数,坐不下题。。。唉。。终于a了一道了。。。求n!阶乘的数的位数。才开始我直接按大数阶乘处理。结果肯定超时。最后看了一下解题报告。原来这么简单,还是做得题少,没接触过。。第一种:log10(n!)=log10(1)+log10(2)+.....+log10(n);循环求和即可,注意最后要+1,因为log10(1)=0;所以要加上这个误差;View Code #include<iostream>#include<cmath>#include<cstdio> 阅读全文
posted @ 2012-01-02 18:45 E_star 阅读(269) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1098题意就是,输入k,然后求对于任意的x,使f(x)能被65整除时,最小的a;数学归纳法证明:f(x)=5*x^13+13*x^5+k*a*x第一步:f(0)=0;成立:第二步:假设f(x)能被65整除,则有5*x^13+13*x^5+k*a*x能被65整出;第三步:则f(x+1)=5*(x+1)^13+13*(x+1)^5+k*a*(x+1);根据二项式定理分析题目:f(x+1)=5*(c(13,0)+c(13,1)*x+c(13,2)*x^2+.......+c(13,13)*x^13)+13*(c(5 阅读全文
posted @ 2011-12-30 20:09 E_star 阅读(325) 评论(0) 推荐(0) 编辑
摘要: http://baike.baidu.com/view/2499752.htm卡特兰数的应用。。。http://acm.hdu.edu.cn/showproblem.php?pid=1023公式:令h(1)=1,h(2)=2,catalan数满足递归式: h(n)= h(1)*h(n-1)+h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=3) 例如:h(3)=h(1)*h(2)+h(2)*h(1)=1*1+1*1=2 h(4)=h(1)*h(3)+h(2)*h(2)+h(3)*h(1)=1*2+1*1+2*1=5 另类递归式: h(n)=h(n-1)*(4*.. 阅读全文
posted @ 2011-12-30 16:43 E_star 阅读(269) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1742多重背包的题目:才开始不知道怎么来统计最后可以给出多少种价格,因为以前的形式都是给出c[i],w[i],b[i]的这里没有给出,后来自己yy了一下,利用多粗冲背包向01背包转换的第一种方法后最后从1到V里所有出现的不同的金钱数量不就是最终可以给出的各种价格吗。01背包转换的第一种方法o(n^3)肯定会TLE代码如下:View Code #include <iostream>#include <cstdio>#include <cstring>using namespace std;const int 阅读全文
posted @ 2011-12-08 16:42 E_star 阅读(761) 评论(0) 推荐(0) 编辑
摘要: 有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}此时他面临的不是01背包的选与不选的问题,而是从n[i]里面选多少个的问题。实现方法:http://acm.hdu.edu.cn/showproblem.php?pid=21911:转化成01背包,将每种背包转换成数量为n[i]的01背包求解View Code #include <iostream 阅读全文
posted @ 2011-12-06 17:24 E_star 阅读(306) 评论(0) 推荐(0) 编辑