基本算法学习笔记

一、并查集(实质是有多棵树的森林)

            优化:  路径压缩:      加快查找速度.

                         按秩合并:  使具有较少结点的树的根指向具有较多结点的树的根。

             并查集删除点:     一开始就用虚拟根表示父节点。

                                           要想直接通过修改father[x]来删除点,就必须一开始就用虚拟根表示父节点

                                           HDU - 2473  https://blog.csdn.net/S_999999/article/details/82014819 

             带权并查集 (种类并查集 ):

                                     HDU 3038    https://blog.csdn.net/S_999999/article/details/95166617

                                     POJ 1182     https://blog.csdn.net/S_999999/article/details/81148593

                                     POJ 2492     https://blog.csdn.net/S_999999/article/details/95077786

                                     POJ 1703     https://blog.csdn.net/S_999999/article/details/95169725

  模板:HDU 1232 

#include <iostream>  
using namespace std;  
int parent[1009],deep[1009];  
void init(int n) {  
    for(int i=1;i<=n;i++){  
          parent[i]=i;  
          deep[i] =0;   
    } 
}  
int find(int x ){  
    return parent[x]==x?x:parent[x] = find(parent[x]);  
}  
  
void merge(int x,int y){  
    int fx=find(x);  
    int fy=find(y);  
    if( fx==fy )  
        return ;  
    
    if( deep[fx] > deep[fy] ){
    	parent[fy] = fx;
	}
	else {
		parent[fx] = fy;
		if( deep[fx] == deep[fy])
		    deep[fy]++; 
	}
    
}  
int main( void ){  
    int n,m;  
    while(cin>>n&&n){  
        cin>>m;  
        init(n);//初始化  
        int x,y;  
        for(int i=1;i<=m;i++){  
            scanf("%d%d",&x,&y);  
            merge(x,y);   
        }  
        int count=0;  
        for(int i=1;i<=n;i++){  
            if(parent[i]==i)//当村庄的根节点编号等于该村庄编号时,代表一个集合  
                count++;  
        }  
        cout<<count-1<<endl;  
    }  
    return 0;  
}  

二、  栈、队列 

                栈模拟过程:  https://blog.csdn.net/S_999999/article/details/81430205

                队列模拟   :   https://blog.csdn.net/S_999999/article/details/81319658 

三、  图论

                 1. 最小生成树 (经过图的所有顶点)

                     Kruskal算法:

                     https://blog.csdn.net/S_999999/article/details/81138839

                     https://blog.csdn.net/S_999999/article/details/84074098       

                     Prime算法: 

                 2. 最短路

                    (最短路问题,通俗的说就是就是给你n个点,m条边,然后找出某两个点之间的最短距离)    

                       Floyd       : https://blog.csdn.net/S_999999/article/details/82711125

                       dijkstral   : https://blog.csdn.net/S_999999/article/details/82707976

                       dijkstral 之多源最短路:https://blog.csdn.net/S_999999/article/details/84202712        

                       SPFA(Bellman-Ford队列优化): https://blog.csdn.net/S_999999/article/details/82779018

                3. 拓扑排序 ( 难点在于图的存储 )

                 https://blog.csdn.net/S_999999/article/details/82695063

                 https://blog.csdn.net/S_999999/article/details/82688704               

                 4. 二分图最大匹配        HDU 1281 棋盘游戏

                 5. 搜索     DFS 、BFS、启发式搜索 、

                     记忆化搜索   HDU 1331 Function Run Fun 、POJ 1088 滑雪   、  P1048采药

                 6.网络流、费用流

         

四、 动态规划

              1.     0 1背包              https://blog.csdn.net/S_999999/article/details/81779149

                                                https://blog.csdn.net/S_999999/article/details/89605183

              2.     完全背包            https://blog.csdn.net/S_999999/article/details/89606894

              3.     多重背包

              4.     分组背包                           https://blog.csdn.net/S_999999/article/details/89646518

              5.     混合背包                           https://blog.csdn.net/S_999999/article/details/89608383

              6.     树状DP、区间DP              https://blog.csdn.net/S_999999/article/details/89977119

              7.    搜索 与DP关系

              8.    最长上升子序列(LIS)     https://blog.csdn.net/S_999999/article/details/81738721

                                                                https://blog.csdn.net/S_999999/article/details/81806108

                                                                https://blog.csdn.net/S_999999/article/details/81805271

            状态压缩模型、概率DP

              9.    最长公共子序列: LCS         https://blog.csdn.net/S_999999/article/details/81809033

五、 数论

               1.   gcd

               2.   欧几里得、扩展欧几里得  

                    https://blog.csdn.net/S_999999/article/details/89332446

                    https://blog.csdn.net/S_999999/article/details/89332075      

               3.  快速幂 、矩阵乘法 、素数筛https://blog.csdn.net/S_999999/article/details/81950792 

               4.  欧拉定理 、费马小定理

               5.    唯一分解定理:   https://blog.csdn.net/S_999999/article/details/89441721

                      算数基本定理 :  https://blog.csdn.net/S_999999/article/details/89437436  

              6.     博弈论                  https://blog.csdn.net/S_999999/article/details/89434158

                      莫比乌斯反演             

                7.   组合数学    

                

              

六、 字符串

                1.KMP           

                2. Manacher

                3. 回文串

                4. 后缀数组

                5.AC自动机

 七、计算几何

 

 

 字典树模板题    https://blog.csdn.net/S_999999/article/details/83352358         

          

发布了761 篇原创文章 · 获赞 134 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/S_999999/article/details/95061119