
经典算法
_王川
屌丝程序员
展开
-
KMP算法
1、KMP算法由来字符串匹配问题描述:参见 LeetCode OJ:Implement strStr()关于这个问题,最简单的想法就是扫描字符串s,一个一个进行比对,具体实现参见问题解答2、简单匹配算法,BF算法,思想较简单,不做解释class Solution { public: int BF(char *S ,char *T) {原创 2014-01-30 20:39:32 · 1337 阅读 · 0 评论 -
作业排序
/*作业排序*/#include #include using namespace std;#define N 5//作业个数struct node{ int p;//效益 int d;//期限 bool operator<(const node&t)const{ return p>t.p; }};node work[N+1]={{0,0},{20,2},{15,2原创 2014-03-13 16:30:59 · 1741 阅读 · 0 评论 -
并查集
int find(int x){ if(field[x]!=x) field[x]=find(field[x]); return field[x];}void make(int x,int y)//将x与y合并{ int f1=find(x); int f2=find(y); if(f1!=f2) field[f2]=f1;}void check(int x,int原创 2014-02-07 18:41:48 · 786 阅读 · 0 评论 -
dijkstra算法
map[i][j]存储i点到j点的权值;visit[i]用于记录访问点w[i]表示0点(即其实点)到i点的最小权值int dijkstra(){ int w[MAX]; for(int i=0;i<=1000;i++) w[i]=INF; int next; w[0]=0; for(int i=0;i!=-1;){ visit[i]=1; next=-1;原创 2014-02-07 16:11:08 · 841 阅读 · 0 评论 -
最大二分匹配
ma[i][j]表示i与j是否可以匹配a与b两个数组用于记录匹配,例如a[i]表示i与b的a[i] 匹配c用于记录访问点ans表示匹配组合数int sp(int u){ int v; for(v=1;v<=m;v++) { if(ma[u][v]&&!c[v]) { c[v]=1; if(!b[v]||sp(b[v])) { b[v]=u;原创 2014-02-07 16:26:19 · 826 阅读 · 0 评论 -
SPFA算法
最短路径问题,是队列优化的bellman-fordint SPFA(int s){ int i; bool visit[N] = {false}; int front = 0, rear = 0; memset(queue,0,sizeof(queue)); for(i=1;i<=n;i++) d[i] = MAX;原创 2014-02-07 16:45:41 · 767 阅读 · 0 评论 -
简洁的heap代码
void MinHeapFixup(int *a,int i){//向上调整 for(int j=(i-1)/2;(j>=0&&i)&&a[i]<a[j];i=j,j=(i-1)/2) swap(a[i],a[j]);}void MinHeapAddNumber(int *a,int n,int num){//push_heap a[n]=num; MinHeapFixup(a,n)原创 2014-02-09 21:09:19 · 1137 阅读 · 0 评论 -
Hash算法
Hash去除重复字符串:#include #include #include #include using namespace std; #define MAX 10000#define MOD 9991char * Hash[MAX][20];int len[MAX];int _hash(char *str){ register int hash=0; wh原创 2014-02-10 11:58:21 · 984 阅读 · 0 评论 -
最大团问题
int N,x[51],//当前解 //bestx[51],//当前最优解 cn=0,//当前顶点数 bestn=0;//当前最大顶点数 void Backtrack(int i) {//计算最大团 if(i>N){ bestn=bestn<cn?原创 2014-02-09 21:35:52 · 1088 阅读 · 0 评论 -
Prim算法
double prim(){ double min[101],res=0; int v[101]; for(int i=0;i<N;i++) { v[i]=0; min[i]=INF; } min[0]=0; for(int i=0;i<N;i++) { int j,k; for(k=-1,j=0;j<N;j++) if(!v[j]&&(k==-1||min原创 2014-02-07 19:18:18 · 801 阅读 · 0 评论 -
树状数组
插入和求和都为logn的数据结构int lowbit(int t){ return t&(-t);}void insert(int k,int d){//插入 while(k<=N){ s[k]+=d; k+=lowbit(k); }}long long getsum(int k){//求和 long long sum=0; while(k>0){ sum+=s[原创 2014-02-07 18:52:13 · 692 阅读 · 0 评论 -
第三十九章续:区间最值RMQ问题
问题描述:找出数组A[],任意区间[i,j]的最小值/*RMQ问题区间最值查询*/#include using namespace std;#define MAX 100//方法1//M[i][j]表示区间i,j最值的索引//构造M复杂度O(n^2)void RMQ1(int M[][MAX],int A[],int N){ int i, j;原创 2014-02-13 17:12:01 · 1041 阅读 · 0 评论 -
IDA*算法
该文主要介绍用IDA*算法实现八数码问题IDA*算法即迭代加深的A*算法,实现代码是最简练的,无须状态判重,无需估价排序IDA*大部分时候比A*还要快,可以说是A*的一个优化版本!/*POJ 1077 EightC++Memory 168KTime 32MS*/#include #include using namespace std;const unsigne原创 2014-02-07 15:19:25 · 4868 阅读 · 0 评论 -
Astar算法
这里主要介绍A*算法的实现:八数码问题 题目参见:HDU 1043 ,POJ 1077 Eight#include#include#include#include#includeusing namespace std;const int MAXN=1000000;int fac[]={1,1,2,6,24,120,720,5040,40320,362880};//康拖展原创 2014-02-06 17:07:08 · 1690 阅读 · 0 评论 -
计数排序
传说中O(n)复杂度的算法,赶紧记下void count_sort(int A[],int B[],int n,int k){//A待排序数组,B排好序数组,n数组长度,k数组元素个数 vector C(k,0); for(int i=0;i<n;i++) C[A[i]]++;原创 2014-02-03 21:12:51 · 820 阅读 · 0 评论 -
经典算法集锦
计数排序KMP算法Astar算法正在整理中......原创 2014-02-07 12:44:43 · 1425 阅读 · 0 评论