
算法与数据结构 模板
feng_zhiyu
这个作者很懒,什么都没留下…
展开
-
【C/C++】磁盘调度及常用调度算法的实现
1、 实验目的(1) 了解磁盘结构以及磁盘上数据的组织方式。 (2) 掌握磁盘访问时间的计算方式。 (3) 掌握常用磁盘调度算法及其相关特性。2、 实验基本知识及原理( 1)磁盘数据的组织 磁盘上每一条物理记录都有唯一的地址,该地址包括三个部分:磁头号(盘面号)、柱面号(磁 道号)和扇区号。给定这三个量就可以唯一地确定一个地址。 ( 2)磁盘访问时间的计算方式 磁盘在工...原创 2018-06-27 10:55:18 · 21712 阅读 · 11 评论 -
(UVa 1395)Slim Span (苗条的生成树)(并查集+Kruskal)
https://vjudge.net/problem/UVA-1395 题意:给出一个n(n<=100)节点的图,求苗条度(最大边减最小边的值)尽量小的生成树分析: 按权值从小到大排序。 对于一个连续的边集区间[L,R],如果这些边使得n个点全部联通,则存在一个苗条度不超过W[R]-W[L]的生成树。#include <cstdio>#include <iostream>#include <v原创 2017-12-31 15:57:14 · 361 阅读 · 0 评论 -
强连通算法--Tarjan算法
转自:这里写链接内容首先我们引入定义:1、有向图G中,以顶点v为起点的弧的数目称为v的出度,记做deg+(v);以顶点v为终点的弧的数目称为v的入度,记做deg-(v)。2、如果在有向图G中,有一条<u,v>有向道路,则v称为u可达的,或者说,从u可达v。3、如果有向图G的任意两个顶点都互相可达,则称图 G是强连通图,如果有向图G存在两顶点u和v使得u不能到v,或者v不能到u,则称图G是强非连通图。转载 2017-12-31 14:32:38 · 442 阅读 · 0 评论 -
素数判断的方法
1.根据定义 时间复杂度O(n)template<typename T>bool is_prime(T n){ for(int i=2; i < n; i++) if(n % i == 0) return false; return true;}2.优化 时间复杂度O(n^(1/2))template<typedef T>bool原创 2017-11-18 18:50:58 · 520 阅读 · 0 评论 -
输入输出挂
以下文字转自:http://blog.youkuaiyun.com/f_zyj/article/details/51473493 题外话: 明明在C语言中有scanf()、printf(),C++中有cin、cout,为什么我们还要用输入输出外挂呢?这个问题很明显,一定是因为这些输入输出函数功能过于强大而导致效率低,(很多时候,功能越强大的东西越臃肿),而我们使用的输入输出外挂既然叫外挂,那说明其一定有很大原创 2017-12-31 10:59:30 · 314 阅读 · 0 评论 -
大数(乘除法)
以下转自:http://blog.youkuaiyun.com/qq_30591245/article/details/54586455反转数组:void reverse(char * c) { int len = strlen(c); for(int i=0; i<len/2; i++) swap(c[i],c[len-i-1]); } 乘法:void m原创 2017-08-22 14:12:06 · 945 阅读 · 0 评论 -
大数加法
#include <iostream>#include <cstdio>#include <cstring>#include <sstream>#include <algorithm>#include <vector>#include <cmath>using namespace std;#define mem(a,n) memset(a,sizeof(a),n)typedef l原创 2017-11-11 14:37:04 · 353 阅读 · 0 评论 -
平行垂直(叉积点积为0)的应用
#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>#include <sstream>#include <string>#include <set>#include <queue>using namespace std;#define mem(a,n)原创 2017-10-06 14:51:41 · 2362 阅读 · 0 评论 -
hdu 4398 X mod f(x)(数位DP)
Time limit2000 msMemory limit32768 kBOSWindowsere is a function f(x): int f ( int x ) { if ( x == 0 ) return 0; return f ( x / 10 ) + x % 10; } Now, you want to know, in a giv原创 2017-09-16 10:28:14 · 793 阅读 · 0 评论 -
【Codeforces Round #460 (Div. 2) D - Substring】(拓扑排序判环+树形dp / dfs判环+记忆化)
链接:http://codeforces.com/contest/919/problem/D 题意:给你一个n个点m条边的有向图,每一个顶点都对应一个字母,定义一条路径的价值为:从一个顶点开始这条路径上出现的字母的最多次数。题目要求输出这个图的最大价值。如果存在环就输出-1.分析: 拓扑排序判环 + dp 拓扑排序 : 由AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下两步,直到原创 2018-02-01 18:45:19 · 348 阅读 · 0 评论 -
【hdu 2196 Computer 】(树形dp求最长路)
链接:https://vjudge.net/contest/204190#problem/C 题意:给一棵树,求树上任意顶点到其他各点的最大值。 分析: 可以容易知道 用树形dp求最长路 首先一次dfs 记录任意顶点到其他各点的最长距离(dp[i][0])和次长距离(dp[i][1])。 例子:http://blog.youkuaiyun.com/feng_zhiyu/article/det原创 2018-01-30 19:18:58 · 452 阅读 · 0 评论 -
【银行家算法】
先引用一个例子:填表法解“银行家算法”问题银行家算法( banker’s algorithm )由 Dijkstra(1065)提出。他将死锁的问题演示为一个银行家贷款的模型。 一个银行家向一群客户发放信用卡,每个客户有不同的信用额度。每个客户可以提出信用额度内的任意额度的请求,直到额度用完后再一次性还款。银行家承诺每个客户最终都能获得自己需要的额度。 所谓“最终”,是说银行家可以先挂起某...原创 2018-06-26 10:25:18 · 3405 阅读 · 0 评论 -
【Python版】排序与搜索
1、搜索1)顺序搜索 复杂度O(n) 无序列表的顺序搜索:# -*- codind: utf-8 -*-def sequentialSearch(alist, item): pos = 0 found = False while pos &amp;lt; len(alist) and not found: if alist[pos] == item:...原创 2018-06-29 19:26:24 · 449 阅读 · 0 评论 -
【Python版】基本数据结构类型
1、栈(后进先出,LIFO)一个栈 (有时称“叠加栈”)是一个项的有序集合。添加项和移除项都发生在同一“端”。 这一端通常被称为“顶”。另一端的顶部被称为“底”。栈的抽象数据类型 栈的抽象数据类型是由以下结构和操作定义的。堆栈是结构化的,如上面所描述的,栈是一个有序的项的集,项添加和删除的一端称为“顶”。栈的命令是按后进先出进行的。栈的操作如下:Stack()创建一个新的空栈。它不...原创 2018-06-29 18:01:20 · 795 阅读 · 0 评论 -
【浙大数据结构题集】习题2.5 两个有序链表序列的合并
题目链接题意:两个有序链表的合并,输出的合并后的非递减链表。思路:主要是输入和合并两个函数,输入用的尾插法,合并则是一一比较,复杂度O(m+n).代码:#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct Node *PtrToNode;struct ...原创 2018-06-07 17:41:26 · 3631 阅读 · 0 评论 -
Java大数运算
ACM竞赛对大数运算时,Python和Java有着语言优势,不过Python现在还不能在正式比赛中使用,所以就用Java来简化写大数类了。 下面是一些简单运算的模板。import java.math.BigInteger;public class Main { public static void main(String[] args) { Scanner sca...原创 2018-05-12 14:08:41 · 2414 阅读 · 2 评论 -
Manacher 算法(求字符串的回文子串的最大长度)
原文链接 一:背景 给定一个字符串,求出其最长回文子串。例如: (1):s=”abcd”,最长回文长度为 1; (2):s=”ababa”,最长回文长度为 5; (3):s=”abccb”,最长回文长度为 4,即 bccb。以上问题的传统思路大概是,遍历每一个字符,以该字符为中心向两边查找。其时间复杂度为 ,效率很差。1975 年,一个叫 Manacher 的人发明了一个算法,M...原创 2018-03-21 13:36:50 · 754 阅读 · 1 评论 -
网络流~最大流算法模板题
Ford-Fulkerson算法 记F为最大流的流量。 通过深度优先搜索寻找增广路,并沿着它增广。 时间复杂度 O(FE) E为边的条数模板题:【hdu 1532】 (Ford-Fulkerson算法和Dinic算法)Ford-Fulkerson算法 模板代码:#include <cstdio>#include <iostream>#includ...原创 2018-02-02 18:53:47 · 910 阅读 · 0 评论 -
圆圈(图形输出问题,递归)
链接:https://www.nowcoder.com/acm/contest/67/G 来源:牛客网时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 圈圈圆圆圈圈,lulu小朋友最近看喜羊羊看多了,老是受刺激就画圆圈,听到小于8的数字时,还会画出十分有规律的圆圈,现在你原创 2018-01-26 15:25:57 · 716 阅读 · 0 评论 -
差分约束与SPFA算法
开始课件上pdf上的一道题,poj3159Candies,是在dijkstra算法中的练习的,刚刚系统的学习图论算法并写代码(虽然上过数据结构,但基本都是理论知识。。)然后就直接用dijkstra算法写,有判断条件没写,一直TLE,在网上看到别人都写着差分约束, 这个,好像听过。。 具体是什么,不知道。 今天花时间看了下这个知识。 基本有了解了,来记下笔记先给出一个定理:(来自算法导论) 给原创 2017-07-26 18:01:08 · 747 阅读 · 0 评论 -
归并排序
归并排序步骤: 1.划分子问题 2.递归求解 3.合并分治法分一种 时间复杂度:O(nlogn) 比快速排序更稳定 缺点:1.用到辅助空间,空间消耗更大 2.需要复制回原数组#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=1e5+5;in原创 2017-08-14 10:15:01 · 329 阅读 · 0 评论 -
单源最短路问题(dijkstra算法)
1.邻接矩阵实现 复杂度O(V^2)int w[MAX_V][MAX_V]; ///w[u][v]表示边u->v的权值(不存在时是INF)int d[MAX_V]; ///顶点s出发的最短距离bool vis[MAX_V]; ///已经连通的点int V; ///顶点数///求起始点s到各个顶点的最短距离void dij(int s){原创 2017-06-22 20:43:26 · 584 阅读 · 0 评论 -
并查集_ 模板
并查集的实现(复杂度:比O(log(n))还要快的阿克曼函数的反函数的数量级,接近于O(1))编号代表每个元素,数组par表示的是父亲的编号,par[x]=x时,x是所在的树的根int par[MAX_N];///父亲int high[MAX_N];///树的高度///初始化n个元素void init(int n){ for(int i=0; i原创 2017-06-21 22:24:43 · 384 阅读 · 0 评论 -
迪杰斯特拉算法_模板
图论之最短路问题原创 2017-06-21 22:10:08 · 770 阅读 · 0 评论 -
Josephus Problem
题目描述Do you know the famous Josephus Problem? There are n people standing in a circle waiting to be executed. The counting out begins at the first people in the circle and proceeds around the circl原创 2017-06-18 14:36:04 · 2060 阅读 · 2 评论 -
N皇后问题(回溯入门)
Problem Description在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。 Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。 Output共有若干行,原创 2017-07-04 17:38:36 · 529 阅读 · 0 评论 -
求一个数的所有素因子
1不是素数也不是合数!#include<cstdio>#include<cmath>using namespace std;typedef long long LL;const int N=105;int main(){ LL a[N],cnt,i,n; while(~scanf("%lld",&n)) { cnt=0; int m=sqrt(n原创 2017-07-26 12:54:55 · 3499 阅读 · 0 评论 -
(hdu 1166)敌兵布阵(线段树入门,单点更新)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 96497 Accepted Submission(s): 40786Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他原创 2017-08-10 09:59:42 · 394 阅读 · 0 评论 -
骨牌问题(DP+矩阵快速幂)
在2*N的一个长方形方格中,用一个1*2的骨牌排满方格。 问有多少种不同的排列方法。例如:2 * 3的方格,共有3种不同的排法。(由于方案的数量巨大,只输出 Mod 10^9 + 7 的结果) Input 输入N(N <= 1000) Output 输出数量 Mod 10^9 + 7 Sample Input 3 Sample Output 3分析:从N小的时候入手,比如N=2原创 2017-07-30 17:48:12 · 1539 阅读 · 0 评论 -
计算几何_向量的实现
将向量用带有两个成员变量的类函数表示表示二维向量的vector2类函数如下:struct vector2{ double x,y; explicit vector2(double x_=0,double y_=0):x(x_),y(y_) {} ///重载 * 号 ,与实数相乘 vector2 operator * (double rhs)const {原创 2017-08-08 09:38:50 · 640 阅读 · 0 评论 -
残缺的棋盘(dijkstra算法)
Input 输入包含不超过10000 组数据。每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同。Output 对于每组数据,输出测试点编号和最少步数。Sample Input 1 1 8 7 5 6 1 1 3 3 2 2 Sample Output Case 1: 7原创 2017-08-07 15:56:40 · 853 阅读 · 0 评论 -
八数码问题(typedef int state[9];)(多种解法)
题目描述 八数码问题,即在一个3×3的矩阵中有8个数(1至8)和一个空格,现在要你从一个状态转换到另一个状态,每次只能移动与空格相邻的一个数字到空格当中,问题是要你求从初始状态移动到目标状态所需的最少步数。如下图所示。 123 123 804 784 765原创 2017-07-19 14:40:42 · 1627 阅读 · 0 评论 -
合并果子(优先队列)
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n−1n−1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子原创 2017-06-21 21:57:01 · 617 阅读 · 0 评论 -
任意两点间的最短路问题(floyd算法)
int d[MAX_V][MAX_V]; ///d[u][v]表示边e=(u,v)的权值(不存在时为INF,d[i][i]=0)int V; ///顶点数void floyd(){ for(int k=0; k for(int i=0; i for(int j=0; j d[i][j]=m原创 2017-06-28 18:01:55 · 1127 阅读 · 0 评论 -
数据结构——线段树
http://blog.youkuaiyun.com/metalseed/article/details/8039326(更新中.....)一:线段树基本概念1:概述线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN)!性质:父转载 2017-06-17 12:28:31 · 532 阅读 · 0 评论