摘要:
如果图没有重边,那么一般的求割边tarjan算法是这么操作的。dfs访问每一个点时,为这个点分配一个时间戳dfn[],根据访问次序的先后,时间戳从小到大对于边(u,v)是不是割边,如果lowv > dfn[u],那么边(u,v)是割边,反之不是。 lowv表示的是从点v开始dfs,所能访问到的最小时... 阅读全文
摘要:
B:题意:给定一个字符串,然后给定m个数字对于每个数字ai的含义是,将ai到n-ai+1的字符串给翻转一遍。要求输出m次翻转之后的字符串。想法就是判断第i个位置的字符是翻转了奇数次,还是偶数次就可以了,翻转了偶数次代表没翻转自己的思想的是:将m个数字存储下来,然后排序。对于每个str[i], 1 2... 阅读全文
摘要:
我们可以将人从前往后两两配对,在同一对人中,如果对手移动后一个人,你总能移动前一个相同的步数,所以一对人的后一个人与后面一对人的前一个人有多少台阶是没有影响的。所以只要考虑同一对人之间有多少台阶就行了,这样就转化为了Nim游戏。如图: a与b配对, c与d配对 ,那么b与c之间的台阶是没有影响的,无... 阅读全文
摘要:
1 #include 2 #include 3 const int N = 100; 4 int step[N];//可以走的步数 5 int SG[N]; 6 bool hash[N]; 7 void getSG(int n, int len)//step的长度 8 { 9 int ... 阅读全文
摘要:
给定n堆石子,每次每人能从一堆石子中取若干个石子(不能不取),最后不能取石子者败对于这个游戏,我们要判断的是,给定局势下,先手者胜还是败设先手胜的局势为N-postion,先手败的局势为P-postion可以移动到P-postion的局势叫做N-postion,只能移动到N-postion的局势叫做... 阅读全文
摘要:
筛法求素数的原理是这样的,先找到第一个素数,然后将第一个素数的倍数都去掉,然后找到第二个素数,然后将第二个素数的倍数都去掉。筛法求素数可以很容易求得小于n的所有素数。如果要求第n个素数,那么就要用素数定理,求得第n个素数所在的范围,然后再用筛法。#include #include #includ... 阅读全文
摘要:
树间距离最长的两点所形成的路径叫做树的最长路设这条路为s->t.很容易想到的方法是以每个点为起点当做s,然后dfs求t。 时间复杂度是O(V*(V+E))但有更简单的方法是,以任意点u进行dfs找到最远点,这个最远点为s或t,然后以这个最远点进行dfs,即可找到最长路那么如何证明以任意点u进行dfs... 阅读全文
摘要:
线段树需要的空间。 区间为1-->n假设是一棵完全二叉树,且树高为i。完全二叉树性质:第i层最多有2^(i-1)个结点。那么 2^(i-1) = n; i = log2(n) + 1;共有 2^i - 1 个结点, 即 2^(log2(n) + 1) - 1个结点即2 * 2^log2(n... 阅读全文
摘要:
拓扑排序O(E), bellman O(VE) , 使用邻接表的dfs O(V+E) ,floyd O(N*N*N)bellman算法只能判断是否存在负环。所以可以先把权值全部设为-1 1 #include 2 #include 3 #include 4 #include 5 using ... 阅读全文
摘要:
拓扑排序是将一个DAG图的所有顶点排成一个线性序列,使得图中任意一对顶点(u,v)若存在边,则u在线性排列中出现在v之前的排列方式(1)算法描述:(a)从网中选择一个入度为零的顶点输出;(b)删除该顶点及其于该点有关的所有边;(c)是否还有入度为零的顶点?若有,执行(a),否则结束。用邻接矩阵时间复... 阅读全文