优先队列 + 并查集 + 字典树 + 欧拉回路 + 树状数组 + 线段树 + 线段树点更新 + KMP +AC自动机 + 扫描线

这里给出基本思想和实现代码 . 

优先队列 : 

曾经做过的一道例题       坦克大战

1 struct node
2 {
3     int x,y,step;
4     friend bool operator <(node s1,node s2)      //   定义结构体   的时候   这个 就是  用于 优先队列的   基准排序 
5     {
6         return s1.step>s2.step;             //    步数小的  在上   为小顶堆  
7     }
8 };
9 priority_queue<node>Q;    //   优先队列的结构体定义说明和 生命方法     

并查集 :

曾经做过的一道例题      七桥问题

 

int findx(int x)
{
    if(x!=parent[x])
        parent[x]=findx(parent[x]);  //   回溯的时候压缩路径  这个是 压缩路径的精髓
    return parent[x];  //   实际上我也看不出来  到底哪里好 ......
}
son :       1 3 8 9
parent :    1 1 3 8
int find(int x)
{
    int k,j,r;      
    r = x;
    while(r != parent[r])       //  
        r = parent[r];
    k = x;        
    while(k != r)           
    {
        j = parent[k];       
        parent[k] = r;
        k = j;              
    }
    return r;            
}

字典树   

曾经做过的一道题   http://www.cnblogs.com/A-FM/p/5181956.html

 

构造一个结构体 , 该结构体 应该有   所有指向下一排所有元素的指针域 ,  还应该有  该节点 必要的信息  

 1 struct node
 2 {
 3     int number;         //  该节点作为 尾节点的次数 
 4     node next[26];   //   和  剩下的  指针域  
 5 };
 6 int Insert(char *a,node *t)
 7 {
 8     node *p,*q;
 9     int id,i,j,l;
10     p=t;   //  已经开了空间
11     l=strlen(a);
12     for(i=0;i<l;i++)
13     {
14         id=a[i]-'a';
15         if(p->next[id]==NULL)   //如果 没有  这个线段的话
16         {
17             q=(node *)malloc(sizeof(node));
18             q->sum=0;
19             for(j=0;j<26;j++)
20                 q->next[j]=NULL;
21             p->next[id]=q;        //  建立线段  . 线段 的 另一端 已经设置好了.
22         }
23         p=p->next[id];
24     }
25     (p->sum)++;
26     return p->sum;
27 }

欧拉回路 :

无向图存在欧拉通路 , 当且仅当改图为连通图 , 而且仅有 0 或 2 个奇数度节点   ( 不可能是 1 )  , 当有0个奇数度节点的时候为回路 , 有两个的是个为通路 .

有向图存在欧拉回路 , 当且仅当该图联通 , 且每个节点的入度 等于出度  . 

有向图存在欧拉通路 , 当且仅当该图连同 除了两个节点以外的的每个节点的入度等于出度 , 在这两个节点中一个入度比出度大一 , 一个出度比入度大一(起点) . 

可以用 并查集检查是否为 图是否连同

 KMP算法( 俗称看毛片算法 )  : 

 

posted @ 2016-04-04 15:27  X-POWER  阅读(266)  评论(0编辑  收藏  举报