摘要:
´有向无环图(DAG),指不存在环的有向图 ´点的入度,指以这个点为结束点的边数 ´点的出度,指以这个点为出发点的边数 ´拓扑序就是对于节点的一个排列使得若(u,v)∈E,那么u在排列中出现的位置一定在v前面 ´而拓扑排序,则是一个用于求解拓扑序的方法(只需要求出一组解) 一个合法的拓扑序(1 2 阅读全文
摘要:
´Tarjan算法是一个通过对图进行深度优先搜索并通过同时维护一个栈以及两个相关时间戳的算法。 ´定义dfn(u)表示节点u搜索的次序编号(时间戳,第几个搜索的节点),low(u)表示节点u或u的子树当中可以找到的最早的栈中的节点的时间戳。 ´由定义,我们可以得到: ´Low(u)=dfn(u), 阅读全文
摘要:
´有向图的极大强连通子图,称为强连通分量。 ´子图指的是选取V的一个子集V’,以及E当中所有满足u,v∈V’的边集E’所指代的图. ´我们需要找出一幅有向图当中的所有强连通分量。 ´一个最朴素的算法: ´构造一个传递闭包(也就是数组Aij表示i能否到达j),然后把Aij=Aji=1的节点置于同一个强 阅读全文
摘要:
´Floyd算法则是需要求出任意两点之间的最短路。(保证有最短路,没有负环) ´我们通过dis[i][j]表示从i到j的最短路径。 ´然后最开始我们设dis[i][i]=0,dis[i][j]=+oo。 ´然后接下来我们尝试从逐个逐个中间点的添加,以扩展路径长度 ´理论上该算法也可以采用多次dijk 阅读全文
摘要:
SPFA原理 设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。 洛谷链接:ht 阅读全文
摘要:
´这个方法基于一点:最短路最多只经过n-1个节点(如果没有负环) ´首先,没有负环; ´然后对于其余的环,我们总可以选择不通过这些环而长度不会更差; ´因此,实际上我们可以通过采取n-1轮对于所有边的松弛操作解决该问题。 ´算法流程: ´初始化dis数组 ´进行n-1轮操作 ´每一轮依次检查每一条边 阅读全文
摘要:
´Dijkstra算法是用于求解正权图当中的单源(出发点唯一)的最短路径问题。 ´下面,我们均假设我们的出发点为1. ´清除所有点的标记,并给每个点设置一个从源点出发的距离,最初d[1]=0,其余d[i]=+oo。 ´循环n次 ´在所有未标记的点当中选择距离最小的节点v ´通过从v出发的所有边(v, 阅读全文
摘要:
LCA:(Least Common Ancestors),即最近公共祖先节点。 阅读全文
摘要:
´Kruskal算法主要分为两步: ´给所有边按照边权从小到大的顺序排序; ´从小到大依次考虑每条边(u,v)(最开始没有任何的边): ´如果u与v已经连通了,那么加入(u,v)后会出现环,不添加; ´如果u与v没有连通,那么加入(u,v)使其连通。 ´然后,对于判断是否联通,我们可以通过并查集来维 阅读全文
摘要:
´我们可以对该算法里面的各个步骤分别考虑: ´初始化:V’={x},E’={},x是随便一个节点; ´这一步只需要随便选取一个点即可; ´重复下列操作,直到V’=V: ´在E集合当中选择最小的边<u,v>使得u∈V’但是v∉V’; ´V’加入节点v,E’加入<u,v>; ´对于上面的第二步,实际上我 阅读全文
摘要:
以下存取方式均为带权图 一、邻接矩阵 二、邻接链表 阅读全文
摘要:
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。 2 .在满足条件1 的情况下使路径最短。 注意:图G 中可能存在重边和自环,题目保证终点没有出边。 请你输出符合条 阅读全文
摘要:
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学。 游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取 阅读全文
摘要:
struct Node { int val; Node *ch[2]; }; int a[maxn], n; Node *root[maxn]; Node* sgtIns(Node* q, int pos) { // 在q的基础上将pos这个位置的数+1, 并返回一个新的线段树的根 int l = 0, r = n; Node *s = new Node, *... 阅读全文
摘要:
推荐:http://blog.csdn.net/x314542916/article/details/7837276 阅读全文
摘要:
1 //一、 树状数组(BT)的第 i 位存储的是以 i 为结尾的长度为lowbit(i) 的一段的和 2 int lowBit(x) { 3 return x & -x; 4 }//lowBit 补码(正数变负数,先减去1之后按位取反(0→1,1→0)eg:-1=-(1)=-(0001-1)=-(0000)=1111) 5 int lowBit(x) { 6 re... 阅读全文
摘要:
推荐:http://blog.csdn.net/dellaserss/article/details/7724401/ 例题:维护一个集合,支持插入一个数,查询一个数字前驱 阅读全文
摘要:
1 int heap[maxn], n; 2 void heapPop() { 3 swap(heap[1], heap[n]); 4 -- n; 5 for (int i = 1, j; i n || heap[i * 2] heap[j]) { 12 swap(heap[i], heap[j]); 13 } els... 阅读全文
摘要:
一、指针版 二、数组版 阅读全文
摘要:
进阶版 阅读全文