您的位置:首页 > 其它

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

2016-04-04 15:27 274 查看

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

优先队列 :

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

struct node
{
int x,y,step;
friend bool operator <(node s1,node s2)      //   定义结构体   的时候   这个 就是  用于 优先队列的   基准排序
{
return s1.step>s2.step;             //    步数小的  在上   为小顶堆
}
};
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;
}


字典树

曾经做过的一道题 /article/11863545.html

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

struct node
{
int number;         //  该节点作为 尾节点的次数
node next[26];   //   和  剩下的  指针域
};
int Insert(char *a,node *t)
{
node *p,*q;
int id,i,j,l;
p=t;   //  已经开了空间
l=strlen(a);
for(i=0;i<l;i++)
{
id=a[i]-'a';
if(p->next[id]==NULL)   //如果 没有  这个线段的话
{
q=(node *)malloc(sizeof(node));
q->sum=0;
for(j=0;j<26;j++)
q->next[j]=NULL;
p->next[id]=q;        //  建立线段  . 线段 的 另一端 已经设置好了.
}
p=p->next[id];
}
(p->sum)++;
return p->sum;
}


欧拉回路 :

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

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

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

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: