自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

parting_soul的专栏

大道至简

  • 博客(33)
  • 收藏
  • 关注

原创 最短路模板

1.dijkstra算法算法思想:从某一个点开始,找与它距离最近的一个点,然后更新所有点到这条路径的距离,然后再次选取一个距离上一个点路径最短的点,将其加入路径,以此进行,直到求出起点到所有点的最短距离.注意:权值不能为负,如图1到3的距离应该是零,但这里结果为一1)邻接矩阵复杂度:o(n^2),而且点不能太多。(无向图模板)#include#include

2015-11-27 18:46:49 462

原创 hdu 1874 畅通工程续(dijkstr朴素)

题目链接: hdu 1874 畅通工程续若不存在a到b的道路,则a到b的距离为无穷,最后判断一下即可#include#include#include#define maxn 222using namespace std;const int inf = 1<<29;int vis[maxn],dis[maxn],mapp[maxn][maxn],n,m;void Dijkstr

2015-11-27 17:47:54 347

原创 hdu 3342 Legal or Not(判断成环)

题目链接:hdu 3342 Legal or Not题目大意:有n个人,m组关系(题目没有说没有重边,若用邻接矩阵,会被坑惨),表示a是b的主人,若存在关系,,则,也就是说a是b的主人,b是c的主人,那么a也是c的主人,这种关系是合法的,则输出YES,若a是b的主人,b是c的主人,c确是a的主人,那么这种关系不合法,则输出NO;思路:这里主要判断是否能进行拓扑排序,若存在环,则不能进行拓扑

2015-11-25 17:51:55 408 1

原创 最小生成树模板(prim+kruskal+prim的优化)

最小生成树:解决极小连通子图连接所有点使得花费最小问题1.prim算法思想:随机选择一个点,作为初始集合,并保存所有点到这个集合的最短距离,然后找与这个集合距离最短的点,也将其加入这个集合,由于新加入了一个点,所以要更新所有未加入集合点到这个集合的最短距离,不断重复,直到连通整个图。1)邻接矩阵(无向图)#include#include#include#define maxn

2015-11-24 01:29:32 818 1

原创 hdu 1863 畅通工程(prim+kruskal)

题目链接:hdu 1879 继续畅通工程(prim)#include#include#include#define maxn 111#define inf 1<<31-1using namespace std;int n,m,ans;int vis[maxn],mapp[maxn][maxn],dis[maxn];//dis记录未被加入集合的点到集合的最短距离void prim

2015-11-24 01:01:35 344

原创 二叉树首尾点的寻找

#include#include#include#define maxn 1111using namespace std;struct Tree{ Tree *lchild,*rchild; char data;};Tree* buildbypre(Tree *t){ char c; cin>>c; if(c=='#') return NU

2015-11-23 00:46:36 431

原创 二叉树的各类遍历

#include#include#include#include#define maxn 1111using namespace std;struct BinTree{ char data; BinTree *lchild,*rchild; int nc; BinTree(){nc = 0;}};BinTree* build(BinTree *t)

2015-11-23 00:07:21 222

原创 层号表示法转孩子兄弟表示法(二叉树)

孩子兄弟表示法:左儿子,右兄弟思路:建树建完一个节点,将其压入栈,以便下一个元素与他比较层号#include#include#include#define maxn 1111#define m 3using namespace std;struct Tree{ Tree *lchild,*rchild; char data; int leve;//记录该节点

2015-11-22 20:15:02 1309

原创 前序遍历的层号表示转孩子数组表示法

思路:有一个层号表示法,如 1a,2b,2s,3v,3e,2e,3w我们可以看出若当前层号比前一个的层号要大,则说明该节点是前一个节点的儿子,若相等,则说明是兄弟,若小于,则说明前面最近的那棵子树建立完毕。当前点的层号比上个节点大时,直接将该节点的父亲记录为上一个节点,若相等,记录兄弟的父亲,若小于,则不断找该节点的兄弟。#include#include#include#defi

2015-11-22 16:31:28 568

原创 hdu 2094 产生冠军

题目链接:hdu 2094 产生冠军#include#include#include#include#define maxn 11111using namespace std;int in[maxn],n;int vis[maxn];int main(){ string a,b; while(~scanf("%d",&n),n) { ma

2015-11-20 22:10:49 286

原创 hdu 1285 确定比赛名次

题目链接:hdu 1285 确定比赛名次拓扑排序:有先后次序的事件,看做点,最先做的前面没有要做的事情,入度为0,先把所有入度为零的点压入队列,我们把入度为0的事情先做了,因为这件事做了,与他相连的事件等下就可以做了,为了区分,将这些相连的事件入度减一,也同样压队列,始终先做入度为0的事件,再将与他相连的事件入度减一。#include#include#include#include

2015-11-20 20:33:07 304

原创 hdu 1272 小希的迷宫(判断成环)

题目链接: hdu 1272 小希的迷宫题意:若整个无向图连通,并且不成环,则输出Yes,否则输出No判断成环:若两个点的祖宗相同,并且这两个点相连,则说明成环整个无向图连通,表明只有一个根节点#include#include#include#define maxn 111111using namespace std;int father[maxn];int Fin

2015-11-17 23:31:31 297

原创 hdu 1232 畅通工程

题目链接: hdu 1232 畅通工程#include#include#define maxn 1111using namespace std;int father[maxn];//用来保存下标节点的父亲节点int Find(int x){ if(father[x]==x) return x;//根节点的父亲节点是本身,即返回父亲 father[x]=Find(fa

2015-11-17 22:03:37 303

原创 括号表示法转孩子指针法

具体思想与括号转孩子数组法相同,只不过这里由指针方式实现详见#include#include#include#define maxn 111111#define m 3using namespace std;struct Tree{ char data; Tree *child[m]; Tree(){memset(child,0,sizeof(child)

2015-11-14 12:52:20 542

原创 括号表示转孩子数组表示法

思路:有一个括号表示的一串序列,假设为A(B,C(Q,E),D),我们发现出现(则表示下面一些元素为(前面一个元素的子女,知道出现),所以们在出现(时,就要把之后的元素与他的父亲相连,这里用孩子数组法,也就是父亲节点保存了所有孩子的下标,每次遇到(,就要保存他前一个元素,可以把它压入栈中,然后之后遇到的字母都为该栈顶的子女,直到遇到右括号,用栈的好处就是当括号里还有括号,考虑到就进原则,括号内的元

2015-11-14 11:27:06 925

原创 hdu 1247 Hat’s Words

题目链接:hdu 1247 Hat’s Words题意:输入很多单词,然你输出那些可以由这些单词拼接并且在这些单词内的单词解析:建立字典树,到单词尾部则标记为1,并把所有单词存在一个数组中,然后开始查找,从第一个单词开始找,若在该单词中间碰到末尾标记1,则表示该字串也在这些单词中出现,只要查询该单词的后半部分是否在这些单词中出现,若出现,则说明这个单词可以由其他单词拼接而成。#incl

2015-11-13 20:25:33 366

原创 孩子指针表示法关于前序遍历的括号表示和凹入表示

#include#include#define maxn 11111#define m 3using namespace std;typedef struct k{ char data; struct k *child[m];}Tree;Tree *createbypre(Tree *t){ char c; cin>>c; if(c=='#

2015-11-12 12:07:23 826

原创 普通树的存储与遍历(合集)

1.双亲表示法#include#include#define maxn 1111using namespace std;typedef struct node{ char data;//节点的值 int parent;//该节点的父亲}node;typedef struct tree{ node treelist[maxn];//节点 int l

2015-11-11 20:00:57 538

原创 hdu 2896 病毒侵袭

题目链接:hdu 2896 病毒侵袭简单的变形,说来惭愧,弄了我一个下午,始终在Tl和WA和爆内存间徘徊首先在建立字典树时,要稍微修改,每个单词的末尾记录为该单词的序号,以便在输出在主串中找到哪些单词第二点变化之处,在询问时,每当找到单词,将它的尾部存的序号存入一个数组进行保存,还要统计出现单词的个数,对后面判断是否有单词出现提供依据说说我被坑的地方;第一:中间不要用fill函

2015-11-11 16:30:24 267

原创 AC自动机模板

在串里找单词实际上是一个一个找,找到一个字符一样,加上他的count值,然后通过失败指针返回根节点,所以要用一个temp来这样做,p的指针始终通过主串来改变,找到一个字符相等,p不变,temp变,再比较p的儿子与主串中下一个字符,重复以上操作#include#include#include#include#define maxn 1000005using namespac

2015-11-10 21:53:55 310

原创 hdu 2222 Keywords Search

题目链接:hdu 2222 Keyworld Serach字符串的多模式匹配题意:给你n个单词和一个主串,让你求有多少单词在主串中出现#include#include#include#include#define maxn 1000005using namespace std;int head,tail;//队列头尾指针struct node{ node *fa

2015-11-10 21:49:17 255

原创 poj 1979 Red and Black

题目链接: poj 1979 Red and Black题意:n*m矩阵,“.”表示能走,"@"为起点,"#"不能走,求所能经过的步数#include#include#define maxn 1111using namespace std;int vis[maxn][maxn];char s[maxn][maxn];int n,m,ans;int dir[4][2]={{1,

2015-11-07 16:21:57 251

原创 简单的递归应用

1.找数组中的最大值顺序查找:复杂度o(n)其中调用前res的初值应为负无穷int find_max2(int a[],int l,int n,int res)//复杂度o(n){ if(l==n) return res; int MAX1=find_max2(a,l+1,n,res); res=max(MAX1,a[l]); return res;

2015-11-07 15:11:22 312

原创 关于链表的递归操作

不带头结点链表翻转思路: 假设有1,2,3,4,5,6,这样6个数构成一个链表,要进行翻转操作,结果应为6,5,4,3,2,1,假设要翻转1 ,那就要先翻转2,,要翻转2,就要翻转3,直到要翻转6,就是当剩下一个元素或者链表为空时作为结束条件假设2,3,4,5,6,已经翻转,此时结果为1,6,5,4,3,2,可见,我们只需将1移到2后面就行了,还可以看到1一直是指向2的,所以找到2的位

2015-11-07 12:22:34 1465

原创 hdu 1686 Oulipo /poj 3461

题目链接:hdu 1686 Oulipo题意:给你两个串,让你在第二个串中找第一个串,输出找到的个数。思路:找到一个,次数加一,然后假设这一点没有匹配继续往下找#include#include#include#define maxn 1111111using namespace std;char s[maxn],p[maxn];int Next[maxn];void Ge

2015-11-06 21:01:35 286

原创 poj 2406 Power Strings

题目链接:poj 2406 Power Strings题意:让你求循环子串的个数设串的长度为len,串为,S=s0,s1,s2,s3,s4····sn循环子串满足一个性质:若len/(len-next[len])的余数为零,则存在循环子串,数目为len/(len-next[len]),子串为str=s0,s1,s2···s[len/(len-next[len])-1],若余数不为零,表

2015-11-06 20:12:34 218

原创 hdu 1867 A + B for you again

题目链接:  hdu 1867 A + B for you again题意:有两个串,让你求两个串的和,也就是头或尾部的公共串相重合,实现两个串的相加,若两个串头尾重合的长度相同,则按字典序输出。因为没有说哪一个为模式串,哪一个为匹配串,所以两个串的不同顺序都要考虑,进行两次查询公共长度。#include#include#include#define maxn 111111

2015-11-06 17:31:50 268

原创 hdu 1711 Number Sequence

题目链接:hdu 1711 Number Sequencekmp模板题#include#include#include#define maxn 11111using namespace std;void get_next(char d[],int Next[]){ int i=0,k=-1; int len=strlen(d); Next[0]=-1; while(i<

2015-11-03 16:05:12 224

原创 hdu 2087 剪花布条

题目链接: hdu 2087 剪花布条题目的意思是求有多少个子串,子串间没有重叠部分,所以是kmp水题#include#include#include#define maxn 1111111using namespace std;char s[maxn],p[maxn];int Next[maxn],slen,plen;void GetNext(){ int i

2015-11-03 15:58:49 324

原创 kmp模板

#include#include#include#define maxn 11111using namespace std;void get_next(char d[],int Next[]){ int i=0,k=-1; int len=strlen(d); Next[0]=-1; while(i<len) { if(k==-1||d[i]==d[k]) {

2015-11-03 15:56:29 231

原创 01背包

有n个重量和价值为wi和vi的物品,从这里选出重量不超过w的物品,使得其价值最大方法一:穷竭搜索#include#include#define maxn 11111using namespace std;int W[maxn],V[maxn],n;int dfs(int i,int j,int sum) //i为当前第i个物品,j为重量的剩余,sum为当前的价值{

2015-11-01 21:50:46 340

原创 组合数取模

有公式C(n,m)=C(n-1,m)+C(n-1,m) 表示在n个东西里取m个,可变成有两种情况组成,第一个取,则在n-1种取m-1个,第一个不取,则在n-1个中取m个#include#include#define mod 1000000007#define maxn 1005using namespace std;int dp[maxn][maxn];//dp[i][j]表示在i个

2015-11-01 21:23:17 241

原创 稀疏矩阵的快速转置

#include#include#define maxn 111using namespace std;int a[maxn][maxn],n,m,cnt=1;typedef struct{ int x,y,val;//x为横坐标,y为纵坐标,val为值}matrix;void Scan()//输入矩阵{ for(int i=1;i<=n;i++)

2015-11-01 00:00:17 595

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除