![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm
文章平均质量分 73
JKay_Wong
一个对计算机有兴趣的菜鸟
展开
-
Heap_Sort,Shell_Sort and Quick_Sort
介绍三种排序,堆排序、希尔排序和快速排序。首先是堆排序:一个有n个记录的线性序列{R1,R2,R3,....Rn},其关键字序列{K1,K2,....,Kn} 满足{Ki 来表示堆的话,就是说该树中的非叶子结点的值均不大于(或不小于)其左右两个分支结点的值。堆排序有两个关键步骤: (1原创 2011-08-20 17:25:04 · 1609 阅读 · 3 评论 -
CLRS中的BFS、DFS、ToPoSort
//算法导论中的广度优先搜索#include #include #include using namespace std;#define WHITE 0 //为访问该结点时#define GRAY 1 //发现该结点时#define BLACK 2 //该结点的所有邻接点都已经访问结束时#define Nil 0#define INF 99999999int原创 2012-02-15 22:12:46 · 799 阅读 · 2 评论 -
动态规划——HDOJ 1003
HDOJ 1003 Max Sum/*HDOJ 1003求最大子序列和,简单DP*/#include using namespace std;struct Sub_len{ int star; int end;}s[100001];int m[100001];int dp[100001];int main(){ int nCase,i,n,j,k,_max原创 2012-02-15 03:02:14 · 818 阅读 · 0 评论 -
素数的Miller_Rabbin判定算法
伪素数:如果n是一个正整数,如果存在和n互素的正整数a满足a^n-1≡1(mod n){a^n-1次方modn等于1},我们说n是基于a的伪素数。如果一个数是伪素数,它几乎肯定是素数。(即下面的费马小定理)费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p) 假如p是质数,且a,p互质,那么 a的(p-1)次方除以p原创 2012-02-14 23:01:34 · 1262 阅读 · 0 评论 -
素数筛选——爱拉托逊斯筛选法
The Sieve of Eratosthens爱拉托逊斯筛选法思想:对于不超过n的每个非负整数P,删除2*P, 3*P…,当处理完所有数之后,还没有被删除的就是素数。若用vis[i]==1表示已被删除,则代码如下:memset(vis, 0, sizeof(vis));for(int i = 2; i <= 100; i++) for(int转载 2012-02-14 21:15:46 · 2797 阅读 · 0 评论 -
素数——POJ 2262
POJ 2262 Goldbach's Conjecture/*POJ 2262Goldbach's Conjecture就是验证哥德巴赫猜想因为目前为止,都没证明它是错的,所以测试的数据肯定不会出现错误的情况。*/#include using namespace std;bool Is_prime(int a){ //素数判断 if(a%2 == 0) ret原创 2012-02-14 19:30:04 · 680 阅读 · 0 评论 -
素数——HDOJ 1262
HDOJ 1262 寻找素数对/*HDOJ 1262 需找素数对为了找出最相近的两个素数,只需要从num/2倒着来找就可以了*/#include bool Isprime(int num){ if(num%2 == 0) return false; for(int i=3;i*i<=num;i++) if(num%i == 0) return false;原创 2012-02-14 22:10:45 · 717 阅读 · 0 评论 -
素数回文——HDOJ 1431
HDOJ 1431 素数回文打表水过。。。/*#include #include using namespace std;const int MAX=100000001;const int SQRT=sqrt(MAX);bool prime[MAX]={1,1};int arr[MAX],len=0;bool Is_Huiwen(int num){ int re_n原创 2012-02-14 20:58:25 · 893 阅读 · 0 评论 -
图论——HDOJ 1116
HDOJ 1116 Play on Words/*HDOJ 1116考察欧拉回路和欧拉通路的定义:首先要存在欧拉通路和欧拉回路,那么这个图必须是连通图。有向图的欧拉通路:除了有两个顶点,一个入度比出度大一,一个出度比入度大一,其他所有顶点都是出度等于入度有向图的欧拉回路:所有顶点都是出度等于入度由于这道题目是抽象为有向图,所以就只需要考虑有向图的情况就OK咯。用并查集判断是否原创 2012-02-13 21:59:24 · 878 阅读 · 0 评论 -
图论——HDOJ 1142
HDOJ 1142 A Walk Through the Forest/*HDOJ 11421代表他的office,2代表他的house题目要求的是1到2之间的最短路径的数目。首先就先求出2到所有点的最短路径,然后再求2到1的最短路的数目。下面是题目描述中的一句话He considers taking a path from A to B to be progress i原创 2012-02-13 20:32:09 · 1014 阅读 · 0 评论 -
并查集——HDOJ 1325
HDOJ 1325 Is it a tree/*HDOJ 1325并查集的基本运用,考察树的基本定义不能有环,不能是森林,每个点的入度最大为1.*/#include using namespace std;const int Max=1001;int rank[Max]; //顶点的秩int p[Max]; //顶点x的父节点int In[Max]; //存储每个原创 2012-02-13 02:33:34 · 806 阅读 · 0 评论 -
并查集——HDOJ 1272
HDOJ 1272 小希的迷宫/*HDOJ 1272并查集的基本运用。符合要求的情况是:1、图是一个无环的图2、图是连通图特别注意,如果一开始就输入 0 0 是符合要求的*/#include using namespace std;int p[100001]; //p[x]是x的父亲int rank[100001]; //rank[x]是x的秩int Fin原创 2012-02-12 22:25:11 · 882 阅读 · 0 评论 -
并查集——HDOJ 1213
HDOJ 1213 How Many Tables/*HDOJ 1213 并查集的基本运用,求集合数*/#include using namespace std;int rank[1001]; //元素的秩int p[1001]; //元素的父亲int Find(int x){ int root,y,w; y=p[x]; while(p[y] != y) {原创 2012-02-12 21:13:56 · 850 阅读 · 0 评论 -
MST/UFS——HDOJ 1232
这道题用两种最常用的方法做,一种是用并查集,一种使用图的深度优先遍历HDOJ 1232 畅通工程/*HDOJ 1232 畅通工程用并查集做*/#include using namespace std;#define INF 999int N,M;int p[1005];int rank[1005];int Find(int x){ int y,w,r原创 2012-02-20 21:47:01 · 787 阅读 · 0 评论 -
快速求积、求幂、大数取模
1.快速求积,a*b=a*2*b/2int fast_mul(int a, int b){ int m = 0; while(b){ if(b % 2) { //a*b = a+a(b-1) m += a; --b; } else原创 2012-02-11 18:08:02 · 1259 阅读 · 0 评论 -
离散化——HDOJ 1199
HDOJ 1199 Color the Ball/*HDOJ 1199先离散化,然后再搜索最长的白色区间只存白色区间,是黑的时候,处理过程要将各种情况分清楚。本体看起来就是可以用区间树的,可惜我还不会咯*/#include #include using namespace std;struct white{ int x; int y;}s[3000];bool原创 2012-02-14 03:23:53 · 799 阅读 · 0 评论 -
大数运算——HDOJ 1002
HDOJ 1002 A+B/*HDOJ 1002大数加法*/#include #include using namespace std;int a[1001],b[1001],sum[1001];int main(){ int nCase,i,j,cf,temp, length_a,length_b,length_sum; string temp_a,temp_原创 2012-02-11 22:52:23 · 897 阅读 · 0 评论 -
几道HDOJ数学题
HDOJ 1061 题目描述/*HDOJ 1061求n^n 的个位,和求(n%10)^n是一样的,然后再利用快速求幂算法*/#include using namespace std;int digit(int a,int n){ if(n == 0) return 1; if(n == 1) return a; else{ int temp; if(n原创 2012-02-11 22:20:01 · 778 阅读 · 1 评论 -
最短路径——Bellman_Ford算法
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。Bel原创 2012-02-22 21:39:56 · 2294 阅读 · 0 评论 -
STL——HDOJ 1004
HDOJ 1004 Let the Balloon Rise/*HDOJ 1004 STL map的使用*/#include #include #include using namespace std;map ballon;string color;int main(){ int nCase,_max; while(cin>>nCase && nCase) {原创 2012-02-15 17:53:20 · 760 阅读 · 0 评论 -
SPFA——HDOJ 1534/3440
HDOJ 1534 Schedule Problem这里不再写分析,题目分析看这里HDOJ 1534分析#include #include #include #include using namespace std;#define MAXN 1010#define INF 1000000001struct edge{ int to; int weight;};v原创 2012-02-27 00:38:23 · 910 阅读 · 0 评论 -
再写_归并排序
还是觉得武大教授写的数据结构的书比较适合我,想法比较接近,易懂。看回暑假写的归并排序,真的是一头雾水,看看书什么的,也讲得不怎么样,下面这个是我自己最喜欢的一个版本。#include using namespace std;void Merge(int r[],int low,int mid,int high){ //将两个有序表直接归并为一个有序表 //每次归并完都将结果保存原创 2011-12-12 10:53:39 · 968 阅读 · 0 评论 -
多重背包——POJ 1276
POJ 1276 Cash Machine/*poj 1276多重背包题目,cost 与 value 是同一个*/#include using namespace std;int inline Max(int a,int b){ if(a>b) return a; return b;}int W[12],V[12],dp[100010];int main()原创 2012-04-09 21:47:09 · 1507 阅读 · 0 评论 -
完全背包——POJ 2063
POJ 2063 Investment/*POJ 2063典型的多重背包问题每种债券的价格是重量,每年的利息是价值这道题目多了个增长的年数,所以每一年得到利息+本金后,就要重新进行一次债券的购买选择*/#include using namespace std;int values[15]; //债券价格int interest[15]; //年利息int dp[999原创 2012-04-08 16:10:59 · 1106 阅读 · 0 评论 -
大数阶乘——POJ 1423
POJ 1423——BIG NUMBER题意:给出一个数字N,求N!的结果的位数。首先要求一个数字有多少位,可以用(int)log10(num)+1,这样就求出num有多少位.数N可以到10^7这么大,直接暴力的话 肯定超时。考虑下面良种方法,个人比较推荐第二种。第一种是直接打表,避免重复计算,如果要追求速度的话,可以在程序外打表,然后导入,在程序中直接查,即可,那样肯定0MS原创 2012-04-07 11:20:59 · 1631 阅读 · 0 评论 -
最大流(Dinic模版)——HDOJ 1532
HDOJ 1532 Drainage Ditches这道题目是用来做Dinic算法的模版题目,而上一篇博客 最大流——HDOJ 3549 是用来作为EK算法的模版题目。关于Dinic算法的讲解,网上有很多,我这里也不多讲什么。推荐一篇讲得比较容易懂的 http://comzyh.tk/blog/archives/568/#Dinic-Code/*HDOJ 1532最大流经典入门题目原创 2012-03-05 21:45:02 · 1105 阅读 · 0 评论 -
最大流(EK模版)——HDOJ 3549
HDOJ 3549 Flow Problem这道题目可以作为最大流算法的模版,也是最简单的最大流题目之一/*HDOJ 3549 Flow Problem最大流,第一道题目,纯粹是理解EK算法*/#include #include using namespace std;#define min(a,b) (a)<(b)?a:b#define N 16int capa原创 2012-03-03 00:48:21 · 1350 阅读 · 0 评论 -
差分约束——HDOJ 1529
HDOJ 1529 Cashier Employment断断续续做了3天才弄明白,真是一道经典题/*HDOJ 1529 Cashier Employments[i]保存从24时刻开始到i时刻的雇佣人数t[i]保存i时刻能够上班的人数r[i]保存i时刻至少需要的人数只要开始工作就要连续工作8小时,有下面的约束条件0 <= s[i]-s[i-1] <= t[i]s[i]-s[原创 2012-02-29 23:33:01 · 843 阅读 · 0 评论 -
Floyd算法求图的传递闭包
Floyd算法的一个应用吧/*设R是非空集合上的关系,R的传递闭包是A上的关系R',使得R'满足以下条件:1)、R'是传递的2)、R是R'的子集3)、对A上的任何包含R的传递关系R'',有 R'是R''的子集下面是用Folyd-Warshall算法来解*/#include using namespace std;int main(){ int vexnum,arcnu原创 2012-03-01 21:15:11 · 2510 阅读 · 0 评论 -
MST——HDOJ 1102/1875
HDOJ 1102 Constructing Roads/*HDOJ 1102MST基本应用*/#include using namespace std;#define INF 2000int graph[103][103];int lowcast[103];int find[103];int N,sum;void Prim(int v){ int i,j,原创 2012-02-21 22:14:04 · 832 阅读 · 0 评论 -
MST——HDOJ 1233/1863/1879
HDOJ 1233 还是畅通工程/*HDOJ 1233 还是畅通工程简单的MST就行了*/#include using namespace std;#define INF 99999999int graph[103][103];int sum,N;void Prim(int v){ int lowcast[103]; int i,min,j,k; for(i原创 2012-02-21 00:23:15 · 695 阅读 · 0 评论 -
差分约束——HDOJ 1384
HDOJ 1384 Intervals/*HDOJ 1384输入n个区间和n个数字c区间[a,b]间至少有c个数字s[i]表示从0到i之间共有多少个整数 约束条件s[b]-s[a] >= c0 <= s[i+1]-s[i] <= 1要求同时满足这些区间要求的最少的元素个数求下界,用最长路*/#include #include using namespace std;原创 2012-02-28 22:22:34 · 1014 阅读 · 0 评论 -
优先队列优化Dijkstra算法
//邻接表+优先队列+Dijkstra模版#include #include using namespace std;#define MAXN 101#define INF 999999class Graph; //有向图class Vnode; //头结点class Arcnode //表结点{ friend class Graph; friend class原创 2012-02-28 15:10:45 · 4536 阅读 · 5 评论 -
差分约束——HDOJ 3592
HDOJ 3592 World Exhibition/*HDOJ 3592典型的差分约束问题x <= a-b <= ya-b >= xb-a <= -x全部转化为<=的形式,求上界,最短路*/#include #include #include using namespace std;#define INF 1000009#define MAXN 1005st原创 2012-02-27 23:11:46 · 992 阅读 · 0 评论 -
最短路径——SPFA算法
关于SPFA(Shortest Path Faster Algorithm)算法,网上的实现与叙述已经有很多,所以在这里也不多说,在NOCOW上面有详细述说。这个算法是对Bellman_Ford算法的一个队列优化,减少冗余计算。在计算带有负值边的图的最短路问题时是非常好的选择,当然在差分约束系统问题中也是首选。这个算法的一个特点是,每个顶点可以进队不仅一次,在图中存在负权回路的时候,在原创 2012-02-26 14:55:38 · 3333 阅读 · 0 评论 -
差分约束——HDOJ 1534
HDOJ 1534 Schedule Problem/*HDOJ 1534 差分约束系统,建图还是那么弱,刚接触了一道题目而已看来还需要多多训练才行。先更具题目的给出的地中情况:FAS, SAF, FAF, SASS:start A:after F: finishFAS x, y 表示x finish after y start设star原创 2012-02-25 23:22:37 · 1148 阅读 · 0 评论 -
差分约束——HDOJ 3440
HDOJ 3440 House Man/*HDOJ 3440 house man差分约束系统类型的题目,难点在建图把每个房子作为一个顶点,然后按照高度排序每两个顶点之间有两条边,但是两楼间的距离又是处于1到D之间的,所以就规定低的指向高的为D建图按照 下标小->下标大 权值为D由于 大-小>=1 所以 反过来 小-大下表小 权值-1*/#include #include原创 2012-02-25 01:09:44 · 1035 阅读 · 0 评论 -
用 Dijkstra算法解决的几道HDOJ题目
HDOJ 2066 一个人的旅行/*HDOJ 2066最短路算法的简单应用*/#include using namespace std;#define INF 9999999int graph[1005][1005];bool find[1005];int dist[1005];int s[1005];int d[1005];int S,T,D;void Sh原创 2012-02-18 21:00:37 · 1348 阅读 · 0 评论 -
几道递推题目
HDOJ 1465 不容易系列之一/*HDOJ 1465错排公式与 _int64 类型的用法*/#include _int64 C[25];_int64 Count(int n){ if(C[n] != 0) return C[n]; else { C[n-1]=Count(n-1); C[n-2]=Count(n-2); //下面是错排公式 C[n原创 2012-02-10 22:29:42 · 715 阅读 · 0 评论 -
递推——HDOJ 2048&&2049
接着前一篇日志,两道递推题目,主要都是错排公式的运用HDOJ 2048 神、上帝、老天爷/*HDOJ 2048先用错排公式求出对应的错排总数,然后再求下对应的百分比*/#include _int64 fac(int n){ if((n == 1) || (n == 0)) return 1; else return (n*fac(n-1));}int m原创 2012-02-11 03:08:15 · 1054 阅读 · 0 评论