随笔分类 - ACM — 资料集
摘要:1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 8 #define N 1000 9 10 using namespace std;11 12 int pre[N],lowlink[N],sccno[N],dfn_clock,scc_cnt;13 14 stack stk;15 16 vector G[N];17 18 void DFN(int u)19 {20 pre[u] = lowlink[u] = ++dfn_clock; //时间戳21 stk.push(u);22 ...
阅读全文
摘要:有向图强连通分量的Tarjan算法[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,两者的时间复杂度都是O(N
阅读全文
摘要:1 #include 2 #include 3 #include 4 5 #define N 10000 6 using namespace std; 7 8 void Merge(int *b,int *a,int i,int m,int n) 9 {10 int s = i;11 int j,k;12 //归并13 for(j=m+1,k=i;i>1;33 MergeSort(b,a,s,mid); 34 MergeSort(b,a,mid+1,t);35 Merge(b,a,s,mid,t); //...
阅读全文
摘要:随机函数生成一个超大数组:【code】: 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 int main()10 {11 freopen("random.txt","w",stdout);12 int n;13 scanf("%d",&n);14 int i;15 srand(time(NULL));16 printf("%d\n",n);17 for(i=0;i 2 #include
阅读全文
摘要:1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 int partition(int *a,int left,int right) 8 { 9 a[0] = a[left]; //设置a[left]为主键值,存于a[0],即以a[left]值将[left,right]区间一分为二10 while(left=a[0]) right--; //从右边开始找到比主键值a[0]小的值,移到左边13 a[left]=a[right];14 while(left<right&...
阅读全文
摘要:{1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来。他们间的对应关系可由康托展开来找到。如我想知道321是{1,2,3}中第几个大的数可以这样考虑 :第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小于3的数有1、2 。所以有2*2!个。再看小于第二位2的:小于2的数只有一个就是1 ,所以有1*1!=1 所以小于321的{1,2,3}排列数有2*2!+1*1!=5个。所以321是第6个大的
阅读全文
摘要:http://blog.csdn.net/jokes000/article/details/7839686后缀数组sa:将s的n个后缀从小到大排序后将 排序后的后缀的开头位置顺次放入sa中,则sa[i]储存的是排第i大的后缀的开头位置。简单的记忆就是“排第几的是谁”。名次数组rank:rank[i]保存的是suffix(i){后缀}在所有后缀中从小到大排列的名次。则 若 sa[i]=j,则 rank[j]=i。简单的记忆就是“你排第几”。对于 后缀数组sa 与 名次数组rank ,有rank[ sa[i] ]=i (这是很重要的一点,通过sa与rank的关系可以求出后缀数组)由此可看出,后缀数
阅读全文
摘要:http://www.nocow.cn/index.php/%E5%90%8E%E7%BC%80%E6%95%B0%E7%BB%84后缀数组是字符串处理的一个重要工具。它由原字符串的所有后缀的字典排序而得,具有较高的检索效率。基本概念一、字符串的大小比较: 关于字符串的大小比较,是指通常所说的 “ 字典顺序 ” 比较, 也就是对于两个字符串 u 、v ,令 i 从 1 开始顺次比较 u[i] 和 v[i] ,如果u[i]=v[i] 则令 i 加 1 ,否则若 u[i]v[i] 则认为 u>v,比较结束。如果 i>len(u) 或者 i>len(v) 仍比较不出结果,那么若 l
阅读全文
摘要:康托展开的应用实例{1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来。他们间的对应关系可由康托展开来找到。如我想知道321是{1,2,3}中第几个大的数可以这样考虑 :第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小于3的数有1、2 。所以有2*2!个。再看小于第二位2的:小于2的数只有一个就是1 ,所以有1*1!=1 所以小于321的{1,2,3}排列数有2*2!+1*1!=5个。所以
阅读全文
摘要:c++中string的用法转自http://www.newsmth.net/pc/pccon.php?id=10002714&nid=359771之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用=进行赋值操作,==进行比较,+做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。首先,为了在我们的程序中使用string类型,我们必须包含头文件<string>。如下:#include&
阅读全文
摘要:Tarjan算法 强连通分量转自:http://www.byvoid.com/blog/scc-tarjan/[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(stronglyconnected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(stronglyconnectedcomponents)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方
阅读全文
摘要:nim游戏简介(取(m堆)石子游戏 算法分析)Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(CombinatorialGames)的一种,准确来说,属于“ImpartialCombinatorialGames”(以下简称ICG)。满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动;3、对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么.
阅读全文
摘要:匈牙利算法--过程图解转自:http://wanzhenjie88.blog.163.com/blog/static/4066646920077131486697/转载:以下算法可把G中任一匹配M扩充为最大匹配,此算法是Edmonds于1965年提出的,被称为匈牙利算法,其步骤如下:(1)首先用(*)标记X中所有的非M-顶点,然后交替进行步骤(2),(3)。(2)选取一个刚标记(用(*)或在步骤(3)中用(yi)标记)过的X中顶点,例如顶点xi,然后用(xi)去标记Y中顶点y,如果xi与y为同一非匹配边的两端点,且在本步骤中y尚未被标记过。重复步骤(2),直至对刚标记过的X中顶点全部完成一遍上
阅读全文
摘要:匈牙利算法-包括代码转自:http://wanzhenjie88.blog.163.com/blog/static/4066646920077129405279/?latestBlog匈牙利算法转载:求最大匹配的一种显而易见的算法是:先找出全部匹配,然后保留匹配数最多的。但是这个算法的复杂度为边数的指数级函数。因此,需要寻求一种更加高效的算法。增广路的定义(也称增广轨或交错轨):若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。由增广路的定义可以推出下述三个结论:1-P的路径长度必定为奇数,第一条边和最后一
阅读全文
摘要:最大匹配之匈牙利算法模板。。转自:http://www.cnblogs.com/Mu-Tou/archive/2011/08/11/2135405.html要学习匈牙利算法先要懂得二部图的各种概念。。下面给出由o(∩_∩)oMiYu总结的一般性概念,这些概念很重要,一定要懂。。二分图的基本概念:(意思就是所有的点分成了2个集合x,y.每个集合中的顶点相互间没有边)一个无向图G=<V,E>,如果存在两个集合X,Y,使得X∪Y=V,X∩Y=Φ,并且每一条边e={x,y}有x∈X,y∈Y,则称G为一个二分图(bipartitegraph).常用来表示一个二分图.若对X中任一x及Y中任一y
阅读全文
摘要:转自:http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html【STL】list基础各个容器有很多的相似性。先学好一个,其它的就好办了。先从基础开始。先看看他们的分类吧标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串。非标准关联容器hash_set、hash_multiset、hash_map和hash_multimap。(各容器成员对比
阅读全文
摘要:各个容器有很多的相似性。先学好一个,其它的就好办了。先从基础开始。先看看他们的分类吧标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串。非标准关联容器hash_set、hash_multiset、hash_map和hash_multimap。(各容器成员对比见:【STL】各容器成员对比表)先看看list。listSTL中的list就是一双向链表,可高效地进行插入删除元素。list不支持随机访问。所以没有 at(p
阅读全文
摘要:转自:http://www.cnblogs.com/Mu-Tou/archive/2011/08/11/2135405.html要学习匈牙利算法先要懂得二部图的各种概念。。下面给出由o(∩_∩)o MiYu 总结的一般性概念,这些概念很重要,一定要懂。。二分图的基本概念: ( 意思就是所有的点分成了2个集合 x, y. 每个集合中的顶点相互间没有边 )一个无向图 G = < V, E >, 如果存在两个集合X, Y, 使得X∪Y=V, X∩Y=Φ, 并且每一条边e={x, y}有x∈X,y∈Y, 则称G为一个二分图(bipartite graph). 常用来表示一个二分图. 若对X
阅读全文

浙公网安备 33010602011771号