![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
NOI_yzk
我爱oi oi爱我
展开
-
最小生成树模板——kruskal
kruskal算法int par[MAX_N];struct edge{int u,v,len;}e[MAX_M]; bool cmp(edge x,edge y){ return x.len<y.len; } int find(int x){return par[x]==x?x:par[x]=find(par[x]);} int Union(int x,int y){ x原创 2017-09-24 20:55:32 · 427 阅读 · 1 评论 -
买房子2
题目描述 有天小C突发奇想,自己是不是也该考虑一下买房子的问题了。小C所在的城市被划分成n个区域,这n个区域是连通的,并且从任意一个区域到达另外区域的方案数只有一种。现在这n个区域都有房卖,小C想,如果他要选择买房区域的话,他所在的区域到其他的区域的距离的最远距离是多少。现在告诉你n个区域的连接情况,请你帮他算算,输出对于每个区域离它最远的距离是多少? 输入 输入第一行,一个整数n; 接原创 2017-09-30 11:17:14 · 413 阅读 · 0 评论 -
最大独立子集
题目描述 独立集是指两两不相邻的节点构成的集合。 求一棵树中,独立集的个数。(空集也算独立集) 输入 第一行一个整数n,表示树中节点的个数。 第二行n-1个数,表示每个节点父亲节点的编号。父节点的编号一定小于该节点。 输出 输出一个整数,表示独立集的个数,方案数较多,对1000000007取模。这是道由2012年NOIP初赛问题求解第二道改编过来的题目 可以用树形dp的思想求解:原创 2017-10-02 19:48:36 · 1095 阅读 · 0 评论 -
USACO安全路径
这题是道神题,虽然考试时并没有时间去看这道题目由于是牛i从牛棚1到牛棚i的路径是一样的 我们可以证明:可以生成一个最小路径树同时还可得出一个定理:使变化后的路径最优,那么最多添加一条边设我们添加一条长度为len,连接x和y的边 那么它会构成一个环,且这个环的其他点都存在与x与y到其最近公共祖先的路径上(设这个环上的点为a)。 这时到这些点的路径即可更新,新的路径为newdis[a]=dis[x原创 2017-10-03 08:31:05 · 463 阅读 · 0 评论 -
迪杰斯特拉
迪杰斯特拉是一个经典的图论算法 利用优先队列优化使复杂度由n*n优化到n*logmstruct SP{ int dis[M]; typedef pair<int,int> P; priority_queue<P,vector<P>,greater<P> >q; void dij(int x){ memset(dis,-1,sizeof(dis));原创 2017-10-03 16:19:11 · 348 阅读 · 0 评论 -
bell-man
虽然现在更新有点迟了,但bellman还是一个值得学习的算法void relax(int u, int v, int weight) { if(dist[v]>dist[u]+weight) dist[v]=dist[u]+weight;}bool Bellman_Ford(){ for(int i=1;i<=n-1;i++) for(int j=原创 2017-10-13 20:54:14 · 709 阅读 · 0 评论 -
AC自动机
一个自动AC的东西... 套用KMP的fail指针,然后再是利用字典树进行字典与文章的匹配 以下是模板#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x),i##_end_=(y);i<=i##_end_;i++)#define DOR(i,x,y) for(int i=(x),i##_end原创 2017-12-08 18:57:32 · 202 阅读 · 0 评论 -
矩阵快速幂
一道模板题 可以发现相乘的三个for可以都for到n 矩阵可以把时间复杂度缩为n3logkn^3logk#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x);i<=(y);i++)#define P 1000000007void Add(int &a,int b){ a+=b;原创 2017-12-13 22:15:31 · 275 阅读 · 0 评论 -
莫队算法
莫队算法较为朴素,适用于大部分的区间查询,主要在于对询问的排序 和区间的滑动 排序参照一下模板struct node{ int l,r,id; bool operator <(const node &_)const{ if(_.l/S!=l/S)return l<_.l; return r<_.r; }}Q[M];然后是L和R的滑动int原创 2017-12-19 21:39:32 · 299 阅读 · 0 评论 -
线性筛
线性筛O(n) 推导一下复杂度: 对于第二重循环 可发现30=2*3*5是由15=3*5推出来的 有一个数的最小质数为x 则可用小于等于这个x的质数推出其他合数 那么每个数只会被推出一次(它只有一个最小质数) 所以总的复杂度为O(n)#includeusing namespace std;#define FOR(i,x,y) for(int i=(x),i##_END=(原创 2018-01-04 21:24:25 · 324 阅读 · 0 评论 -
中国剩余定理
中国剩余定理,是建立在扩展欧几里得上的算法 用来求线性模方程的解 即给出许多模数mi,然后给出余数ai,求原数x 代码如下struct China{ #define N 5 LL A[N],p[N],T[N],m[N],T1[N],M; int n; void exgcd(LL a,LL b,LL &x,LL &y){ if(!b){x=1;y=原创 2017-12-28 22:09:31 · 371 阅读 · 0 评论 -
道路改建
题目描述 一个由n户人家组成的村庄,用n-1条路径连接,形成一棵树。 现在进行道路改建,先把某条边的删除,再用这条边连接其他两个点(保持长度相同)。 使得最后村庄之间仍能相互到达,且最远的两个村庄之间的距离最小。 输入 第一行一个整数n,表示村庄的个数。 接下来n-1行,每行3个整数a、b、c,表示有一条路径连接编号为a和b的村庄(编号从0开始)。 输出 输出可以使原创 2017-09-30 10:58:50 · 816 阅读 · 1 评论 -
二分图最大匹配(匈牙利算法)
前言:二分图最大匹配其实就是二分匹配 利用了增广路的思想实现了点对间的一一配对 若想理解匈牙利算法可点击此链接代码实现是比较简单的,匈牙利算法在很多关于匹配的题目中有很灵活的运用(纯属博主瞎逼)代码实现如下:int link[M];bool vis[N];bool Look(int x){ for(int i=0;i<edge[x].size();i++){ int原创 2017-10-17 17:08:07 · 305 阅读 · 0 评论 -
图论——最小生成树
最小生成树 首先,生成树是建立在无向图中的,对于有向图,则没有生成树的概念,所以接下来讨论的图均默认为无向图。对于一个有n个点的图,最少需要n-1条边使得这n个点联通,由这n-1条边组成的子图则称为原图的生成树。一般来说,一个图的生成树并不是唯一的(除非原图本身就是一棵树)。 现在考虑带权图G,即图的边带权,则最小生成树就是在G中权值和最小的一颗生成树,显然最小生成树也不是唯一的,但是其权值唯一转载 2017-09-24 20:42:08 · 1951 阅读 · 0 评论 -
数论——扩展欧几里得算法
欧几里得& 拓展欧几里得(Euclid & Extend-Euclid)欧几里得算法(Euclid)背景:欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。转载 2017-09-23 20:11:37 · 293 阅读 · 0 评论 -
贪心专题(1)——区间与点匹配
前言: 贪心这种东西特别的玄学,但它一般是基于排序后的数据,然后进行一波处理 其实有时实在不会写的话就每种排序试一遍,没准就AC了 例1.2941.武装 题目描述 要打仗了,作为将军的你打算用库存的武器武装你的士兵。库存有m个武器,每个武器有一个权重。 有n个士兵,每个士兵有一个武器权重范围minWi和maxWi,只有权重在这个区间的武器才能给这个士兵装备。 请你算算,最多可以装备原创 2017-09-23 18:41:28 · 549 阅读 · 0 评论 -
LCA(最近公共祖先)倍增算法
最近公共祖先有多种算法 如倍增,RMQ,树链剖分等这里先介绍倍增算法 预处理复杂度nlog(n); 询问复杂度log(n);倍增与二进制息息相关 与分块的算法有些相似之处使用倍增算法时开一个fa[n][S]数组 fa[i][j] 表示 i 这个点向上的第1^j个父亲是谁以下是关于如何预处理fa[i][j] 的代码void init() { FOR(j,1,S-1)FOR(i,1,n原创 2017-09-22 15:55:54 · 677 阅读 · 0 评论 -
DFS序+线段树
由于建树的时候使用的是深度优先遍历 则子树节点的遍历时间是连续的 所以,可以用线段树解 线段树的l,r表示时间 然后用Lx[x]和Rx[x]来表示进入x子树的时间和出x子树的时间 例题:1466 苹果树 题目描述:在卡卡的房子外面,有一棵苹果树。每年的春天,树上总会结出很多的苹果。卡卡非常喜欢吃苹果,所以他一直都精心的呵护这棵苹果树。我们知道树是有很多分叉点的,苹果会长在枝条原创 2017-09-21 22:26:12 · 380 阅读 · 0 评论 -
看电视
> 2957.看电视 题目描述 最近有很多好看的电视节目要更新了。用[a,b]这个区间表示一个节目的播放时间。乐乐想知道如果他在[x,y]这段时间内有空,最多可以看多少个节目。请你帮他算算。 输入 第一行两个整数n,表示节目数。 接下来n行,每行两个整数a、b,表示一个节目在a时刻开始,在b时刻结束。第n+1行,一个整数m,表示有m个询问。 接下里m行,每行两个整数x、y。表示乐乐在原创 2017-09-26 16:25:01 · 718 阅读 · 0 评论 -
MIS
2947 MIS 题目描述 长度为m的递增子序列(M length IncreaseSubsequence),称为MIS。 求长度为n的序列,有多少个MIS。子序列不需要在原序列中不需要连续,但要保证相对位置。 输入 第一行两个整数n和m第二行n个整数,表示一个序列。 输出 输出MIS的个数,结果对20140921取余。 对于100%的数据,n的范围[1,10000],m原创 2017-09-26 14:15:00 · 444 阅读 · 0 评论 -
图论——SPFA模板
SPFA是一种求最短路径的算法 SPFA的两种写法,bfs和dfs 判断有无负环: 如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图) bfs判别负环不稳定,相当于限深度搜索,但是设置得好的话还是没问题的, dfs的话判断负环很快下面贴出dfs判负环代码(只能判负环,不能求最短路(隔壁机房得出))//flag 是否有负环void DFS_SPFA(int u){原创 2017-09-28 16:08:19 · 341 阅读 · 0 评论 -
欧拉回路与欧拉道路
欧拉回路与欧拉道路图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。 如果一个图只是形成一个连通所有节点的链,且每一点只走一次,则成为欧拉道路。 具有欧拉回路或欧拉道路的图称为欧拉图(简称E图)。 有向图的欧拉回路 一个有向图存在欧拉回路的前提条件是这个图是个连通图,其次要求其每个点的入度等于出度,或者其中有一个点的出度比入度大1,另一个点的入度比出度大一这样就存转载 2017-10-06 18:40:58 · 570 阅读 · 0 评论 -
排序算法小结
各种排序一.稳定排序 1.记数排序 2.基数排序 3.插入排序 4.冒泡排序 5.归并排序 6.希尔排序 二.不稳定排序 1.选择排序 2.快速排序 3.堆排序计数排序int cnt[105],A[105],B[105];void sort(int n){ FOR(i,1,n){ int x; scanf("%d",&A[i]);原创 2017-09-15 21:10:29 · 422 阅读 · 0 评论 -
莫比乌斯系数的筛法
利用线性筛完成的莫比乌斯系数(函数)的推导 注意mu[1]=1;void init(){ mu[1]=1; FOR(i,2,M-1){ if(!mark[i])prime[++cnt]=i,mu[i]=-1; for(int j=1;j<=cnt;j++){ int t=i*prime[j]; i原创 2018-01-06 20:05:32 · 548 阅读 · 0 评论