- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基本算法模板
1.图论
1.1 并查集 2
1.2 最小生成树
1.3 单源最短路径(dijstra,spfa )
1.4 拓扑排序
1.5 割点个数
2.字符串
2.1kmp 和 ex_kmp
2.2manacher 算法
2.3 最小表示法
3.数据结构
3.1 树状数组
3.2 线段树
4.数学
4.1 矩阵快速幂
4.2lucas 定理和中国剩余定理
4.3 欧拉函数
4.4 扩展欧几里得
并查集
int par[MAX_N]
//初始化n个元素
void init(int n)
{
for(int i=0;in;i++)
par[i]=i;
}
//查询树的根
int find(int x)
{
if(par[x]!=x)
return par[x]=find(par[x]);
return x;
}
//合并x,y所属的集合
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
par[x]=y;
}
//判断x,y是否属于同一个集合
bool same(int x,int y)
{
return find(x)==find(y);
}
单源最短路径问题(Diijkstra 算法)
struct edge
{
int to,cost;
};
typedef pairint,int P;
int V;
vectoredge G[MAX_N];
int d[MAX_V];
void dijkstra(int s)
{
proirity_queueP,vectorP,greaterP que;
fill(d,d+V,INF);
d[s]=0;
que.push(P(0,s));
while(!que.empty())
{
P p=que.top();
que.pop();
int v=p.second;
if(d[v]p.first) continue;
for(int i=0;iG[v].size();i++)
{
edge e=G[v][i];
if(d[e.to]d[v]+e.cost)
{
d[e.to]=d[v]+e.cost;
que.push(P(d[e.to],e.to));
}
}
}
}
spfa 算法
typedef struct edge
{
int to,cost;
}edge;
const int MAX_N=10000;
const int INF=999999;
vectoredge G[MAX_N];//邻接表存储图
bool in_queue[MAX_N];//判断点是否在队列中
int in_sum[MAX_N];//记录点入队列的次数
int dist[MAX_N];//从原点到其他点的最短路
int path[MAX_N];//记录前驱点
int nodesum;//点的个数
int edgesum;//边的个数
bool spfa(int source)
{
dequeintdq;
for(int i=1;i=nodesum;i++)//初始化数组
{
in_sum[i]=0;
in_queue[i]=false;
文档评论(0)