STL
摘要:由于STL是一个统一的整体,map的很多用法都和STL中其它的东 西结合在一起;map中由于它内部有序,由红黑树保证,因此很多函数执行的时间复杂度都是log2N的,如果用map函数可以实现的功能,而STL Algorithm也可以完成该功能,建议用map自带函数,效率高一些……Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字 的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一 颗红黑树(一种非严格意义上的平衡二叉树),这颗树
阅读全文
posted @
2012-03-31 14:39
hrbust_09zhangyabin
阅读(204)
推荐(0)
poj3414
摘要:靠的,写了一上午,终于AC了,靠的............poj的题确实要麻烦一些.代码有点长,但思路一点也不麻烦。1,找最短路时,用bfs。这个很简单。 2,关键,不太熟悉记录路径。最后借鉴了一下别人的算法,用一个结构体数组存储路径,再用dfs 的思想找到起点。顺势输出, KO! 写完之后,回顾一下,就是考察你会不会回溯。要深刻理解回溯啊!太有用了#include<iostream>#include<queue>#include<cstring>#include<cstdio>using namespace std;int a,b,c;int
阅读全文
posted @
2012-03-24 13:32
hrbust_09zhangyabin
阅读(435)
推荐(0)
poj2251-----BFS模板题
摘要:就是在二维bfs的基础上,再添加两个方向。无他呵呵,学了STL,用<queue>超方便啊!好爽,要继续发扬光大AC:#include<iostream>#include<queue>#include<cstring>#include<cstdio>using namespace std;char map[50][50][50];int flag[50][50][50]; //0没有走过,1代表走过 int fanx[6]={1,-1,0,0,0,0};int fany[6]={0,0,1,-1,0,0};int fanz[6]={0,
阅读全文
posted @
2012-03-23 20:43
hrbust_09zhangyabin
阅读(378)
推荐(0)
hdu2680
摘要:简单dijkstra,给了起点集合,一个终点。求起点到终点的最短距离。 n个点,(1..........n)。设置一个虚拟起点0,虚拟起点到起点集合的距离都是0,然后就用模板,以0为起点,求出到终点的最短距离。 本来是抱着轻松愉悦的心情来刷他的,结果一个超级恶心的第几错误让我找了半个小时。好吧,以后,出现莫名其妙是WA就给我一句句的看代码。最终肯定会找出该死的bugAC:#include<stdio.h>#include<string.h>#define inf 100000000int map[1010][1010]; //注意这道题是单向边, 而且我设置 0 为虚拟
阅读全文
posted @
2012-03-21 20:36
hrbust_09zhangyabin
阅读(593)
推荐(0)
hdu1596
摘要:很简单的一道dijkstr模板题,硬是让我RE了一个上午,可恨!这道题map[i][j]的取值范围是[0,1]。结果,我把inf设置为0!kao,莫名其妙的RE接踵而至。快整死我了,后来吧inf改为-100。立刻AC!吐血啊以后在没把握的情况下,远离边界。AC:#include<stdio.h>#define inf -100 //问题就在这儿double map[1010][1010]; //注意重边 double d[1010];int s[1010];int n;double dij(int v,int e){ int i,j,pos; double max; for(i=1
阅读全文
posted @
2012-03-21 12:36
hrbust_09zhangyabin
阅读(266)
推荐(0)
hdu2156
摘要:无聊,临走时候刷个水题。有公式,不说了。sum = n * 1 / 1 + ( n - 1 ) * 2 * 1 / 2 + ( n - 2 ) *2*1/3+.......+(n-i+1)*2*1/i;AC:#include<stdio.h>int main(){double sum;int n;int i;while(scanf("%d",&n)!=EOF&&n!=0){sum=n;for(i=2;i<=n;i++)sum+=2.0*(n-i+1)/i;printf("%.2lf\n",sum);}return
阅读全文
posted @
2012-03-20 21:39
hrbust_09zhangyabin
阅读(132)
推荐(0)
hdu1874--------畅通工程续
摘要:简单的dijkstra模板题。很简单,找一个起点到终点的最短路径。10几分钟就敲好代码了。一交,WA!无语看了disscus,被指点有重边。查,又是重边这个玩意儿。搞什么,读题真读不出来! 然后筛选了一下重边,就AC了。还有一点啊,就是起点等于终点时,要输出0,别输出inf了。其中,我加了一个剪枝条件,if(pos==e||min==inf) break;完全正确,而且时间从15ms 提高到了0 ms。(高兴)AC:#include<stdio.h>#define inf 100000000int map[210][210];int d[210];int s[210];int n,
阅读全文
posted @
2012-03-20 18:37
hrbust_09zhangyabin
阅读(173)
推荐(0)
hdu2066
摘要:其实非常没有必要像刚刚那样,可能是没有真正理解dij吧。 事实上,对每个起点调用dij算法后,每个终点的最短路长度都已经出来了。对于每个起点,从这些终点的最短路中选出最最短路就可以了。 然后在比较每个终点,即求得最小值。照这个思想敲了个代码一交,781ms,才快了110ms。 不应该啊~然后比较了一下网上的代码,发现我没有剪枝。加上条件 if(min==inf) break; // 剩余的点距离都为无穷远时,结束再一交,78ms。好爽,终于ok了。AC:#include<stdio.h>#include<string.h>#define inf 100000000int
阅读全文
posted @
2012-03-20 14:53
hrbust_09zhangyabin
阅读(1125)
推荐(0)
hdu2066----------dijkstra模板题
摘要:这是一道多源点的dijkstra模板题,我整整做了一上午,交了14遍,过了4遍(呵呵,很疯狂啊!)总的来说,收获颇丰。应该算完全掌握了这种算法。这是第一次过的代码,用的超级笨的方法,对每个起点和终点分别调用dij算法。放在low[i][j] (代表第i个点到第j个点的最短距离)中,最后再从low[i][j]找出最短的路径输出。 890ms过的。呵呵,很强,几乎没有比我更慢的啦!嘿嘿(不好意思) ,代码也很长。AC:#include<stdio.h>#include<string.h>#define inf 100000000int map[1051][1051];int
阅读全文
posted @
2012-03-20 14:43
hrbust_09zhangyabin
阅读(406)
推荐(0)
hdu2544-------dijkstra模板题
摘要:昨晚掌握了dijkstra算法,就在hdu找了一道模板题来刷。题很简单,完全就是数据结构上的算法模板敲的。写完一交,WA! 无语,还以为第一次敲这个算法,没理解呢!又上网上找别人能过的算法敲了一个,一交,又WA!,表示很无奈啊!一直交了5,错了5次,快疯了。到最后发现,题目描述骗人,他说c《=1000.事实上c超大。最后设置 inf=100000000,才AC! 唉,这算什么啊算法很简单,dijkstra模板AC:#include<stdio.h>#include<string.h>#define inf 100000000int map[105][105];int d
阅读全文
posted @
2012-03-19 19:32
hrbust_09zhangyabin
阅读(314)
推荐(0)
3月18日
摘要:今天打比赛,好惨啊!就A了一道题,NND全部是字符串, 哥不会字典树,不会map,被虐的好惨啊! 可恶,这种情况很久都没出现了。逼我是吧!好吧,还想等会儿再学map呢! 这下好了,不用等了,三天之内掌握map,干掉这几道题!星期一,迪杰斯特拉!星期二,floyd!星期三,map!星期五,字典树!
阅读全文
posted @
2012-03-18 20:22
hrbust_09zhangyabin
阅读(139)
推荐(0)
hdu1162----------- prim模板
摘要:一个很简单的模板题。中间遇到一个很低级的错误,让我调了半个小时。好了, prim到此为止。接下来还有foyd,djstl,好多啊!加快进度AC:#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>struct point{double x,y;}p[101];double map[101][101];int visit[101];double low[101];int n;int prim(){double min,result=0;int i,j,k,pos;
阅读全文
posted @
2012-03-17 20:13
hrbust_09zhangyabin
阅读(196)
推荐(0)
hdu1879------------prim算法模板
摘要:水题,和1102一样。还不如1863呢!今天好像把连通工程这种类型的题刷光了!嘿嘿嘿,掌握prim后刷一道过一道,好痛快!AC:#include<stdio.h>#include<string.h>int map[101][101];int low[101];int visit[101];int n;int prim(){int i,j,k,pos,min;int result=0;memset(visit,0,sizeof(visit));pos=1;visit[pos]=1;for(i=1;i<=n;i++){if(i!=pos)low[i]=map[pos]
阅读全文
posted @
2012-03-17 19:04
hrbust_09zhangyabin
阅读(259)
推荐(0)
hdu1863-----------------联通工程(并查集加mst)
摘要:这道题先判断给出的路能否让村庄联通,如果能够联通就输出最少要修多长的路,如果不能联通,就输出“?”。判联通时,用并查集,判断这些村庄能否在一个集合。 如果在一个集合,接着用prim算法求最小生成树。哈哈哈,幸亏我先前研究过并查集。很简单,简直是两个模板的综合。 0ms ,AC!好爽AC:#include<stdio.h>#include<string.h>int map[101][101];int low[101];int visit[101];int set[101];int n,m; //n条路, m个村儿int find(int x){int r;r=x;whil
阅读全文
posted @
2012-03-17 17:45
hrbust_09zhangyabin
阅读(256)
推荐(0)
hdu1102------------------------还是畅通工程
摘要:这道题还是用用prim,模板题。和1233畅通工程很类似。做1233时很顺手,做这道时,稍有不同。题中说明,有些路已经修好,不用再修了。求还要最少修多长的路才能全部连通。kao,刚开始想想歪了,不知道怎么处理那些已经联好的路。又是用邻接矩阵,又是用并查集,相邻好几个代码。都不行,最后看了一眼宪哥的代码。看到他把相连接的两条路之间的距离置为0, 一下就明白了。一改,过了。 中的来说,没变,还是prim算法。AC代码#include<stdio.h>#include<string.h>int map[101][101];int low[101];int visit[101]
阅读全文
posted @
2012-03-17 16:34
hrbust_09zhangyabin
阅读(132)
推荐(0)
hdu1233------------------第一道最小生成树prim算法
摘要:prim模板这道题是我同时参考两个模板,才敲出来的!总的说,还行,一次AC!prim已经理解了,加快进度啊!下午掌握Kruskal算法。AC代码:#include<stdio.h>#include<stdlib.h>#include<string.h>int map[101][101];int low[101]; //辅助数组,第 i(i不属于U集合)个点到 U 集合的最短距离 int visit[101];const int da=100000000;int n;int prim(){int result=0;int i,j,k;int pos;int m
阅读全文
posted @
2012-03-16 14:44
hrbust_09zhangyabin
阅读(161)
推荐(0)
hdu1720
摘要:这道题挺有意思,输入两个16进制的数,输出他们的和!例如:1 9A Ba b1 9A Ba bAC代码:#include<stdio.h>int main(){int a,b;while(scanf("%x%x",&a,&b)!=EOF)printf("%d\n",a+b);return 0;}实在没想到还能这么写,受教了!可见对进制转换还是不够了解。
阅读全文
posted @
2012-03-13 21:59
hrbust_09zhangyabin
阅读(126)
推荐(0)
hdu1240-----------------简单BFS
摘要:写完这个题,不得不思考,什么时候学STL。一道简简单单的题被我写成这个样子,真伤心啊!126行代码,别人60行就搞定了。#¥#%*@&........累啊!虽然也是0ms过的!唉,但是写的时候好费力啊!可以说花了整整一个晚上。说实话,题很简单,就是比一般的BFS多加两个方向而已。输入时一个超低级的错误浪费我好久时间。下次注意,细心。不说了,模板题!AC:#include<stdio.h>#include<string.h>char map[12][12][12]; //记录星际地图 int step[12][12][12]; //记录第走到第 step[i][j
阅读全文
posted @
2012-03-13 21:16
hrbust_09zhangyabin
阅读(376)
推荐(0)
hdu1159--------------最长公共子序列(模板)
摘要:没事敲了个最长公共子序列,按照自己笔记本上模板算法! 先敲了一个递归算法的,敲时就感觉费事儿!一提交,果断超时!无语,..........还好哥有个非递归模板,敲完一交。31ms!差距好大啊,以后就用非递归吧!模板在此AC:#include<stdio.h>#include<string.h>char a[10001],b[10001];int c[10001][10001];int lcs_len(int m,int n){int i,j;for(i=0;i<=m;i++)c[i][0]=0;for(i=0;i<=n;i++)c[0][i]=0;for(i
阅读全文
posted @
2012-03-13 14:51
hrbust_09zhangyabin
阅读(126)
推荐(0)
hdu1108------最大公倍数
摘要:一件很蛋疼的事,hdu的网我有时总上不去,真烦人!(虽然后来还是上去了,但折腾时间)。而且发现就我自己有这问题,第一次打开网址是很慢,要耐心(真扯)!等第一次上去之后又就好多了,一天都不会出现问题。上午无聊,刷个水题。先用辗转相除法,求得最大公约数,然后两数之积除去最大公约数,记得到最大公倍数。#include<stdio.h>int gcd(int a,int b){int temp;while(b){temp=a%b;a=b;b=temp;}return a;}int main(){int a,b;while(scanf("%d%d",&a,&
阅读全文
posted @
2012-03-13 09:42
hrbust_09zhangyabin
阅读(175)
推荐(0)
hdu1312---------------DFS模板(调用STL)
摘要:很明显啊!调用STL简单多了,省了30行代码#include<iostream>#include<queue>#include<string.h>using namespace std;char ch[22][22];int r,c;int XX[4][2]={{-1,0},{0,-1},{0,1},{1,0}};struct node{int x,y;};int bfs(int bx,int by,int Sum){ int k; int xx,yy; node t,tt; queue<node>qu; t.x=bx,t.y=by; qu.pu
阅读全文
posted @
2012-03-12 21:46
hrbust_09zhangyabin
阅读(147)
推荐(0)
hdu1312------------BFS(自己写队列)
摘要:因为这是我第一道BFS模板题,想深刻理解,所以不想用STL。就自己写了一个队列,说实话,调用STL真方便啊!等我对算法熟练掌握后,也要用!!算法是固定的:DFS。 因为加了队列代码有点长啊!但总体还是比较清晰的。AC代码:#include<stdio.h>#include<string.h>char ch[22][22];int r,c;int fan[4][2]={{-1,0},{0,-1},{0,1},{1,0}};struct queue //自己搞一个队列玩儿 {int x[100000]; //记录x ,和y坐标 int y[100000]; int fron
阅读全文
posted @
2012-03-12 21:40
hrbust_09zhangyabin
阅读(205)
推荐(0)
星期天有点晕
摘要:唉,为什么泥!因为星期六晚上没睡好呗,................为什么没睡好呢?...................不说了,反正过去了。结果那个星期天过得好混沌啊!一天无精打采,唉,伤感情啊!一天都没学到什么东西。时间就白花花的流过去。 所以,以后可绝不能在这样了,要加快进度了~
阅读全文
posted @
2012-03-12 07:45
hrbust_09zhangyabin
阅读(119)
推荐(0)
kmp模板----------------hdu1686
摘要:首先给出一个模式串 ss[], 然后给出一个主串 s[]。然后让你求 模式串在主串中出现的次数。kmp模板题:一通则百通#include<stdio.h>#include<string.h>char ss[100000],s[1000000]; //ss是模式串, s是主串 int next[100000];int cnt;void getnext(int y){int i=0,j=-1;next[0]=-1;while(i<y){ if(j==-1||ss[i]==ss[j]) { i++; j++; if(ss[i]==ss[j]) next[i]=next[
阅读全文
posted @
2012-03-12 07:33
hrbust_09zhangyabin
阅读(155)
推荐(0)
hdu1856--------------并查集+树
摘要:一次AC,受宠若惊啊!呵呵,一看数据1<=n<=10000000,感觉有点大,很担心超时。题目要求求出最大集合的元素个数。思想是并查集,不会错。有人用了压缩路径的方法,我估计他也是怕在最后遍历时,求元素的根超时。我不太熟悉压缩路径,就在另设置了一个数组root[10000000], 用来存储以 i 为根的集合的元素个数。这样一来,在每次合并两棵树时,将两棵数的集合元素个数相加存放在 root[i]中。并设置全局变量 max,每次将新树的元素个数与 max 比大小。 最后输出 max 即为结果。 342AC代码:#include<stdio.h>int set[10000
阅读全文
posted @
2012-03-10 12:27
hrbust_09zhangyabin
阅读(190)
推荐(0)
hdu1829------------------并查集
摘要:题目大意:Hopper教授正在研究一种稀有虫子的交配行为。他假设它们有两种性别并且它们只与异性交配。在他的实验中,很容易识别虫子和它们的交配行为,因为虫子背后印有编号。问题给定一组虫子的交配行为,确定实验是支持教授的假设即虫子没有同性恋,还是有部分交配行为不符合假设。这道题实际上还是并查集,和以往不同的是。以往给出两个元素的关系,然后认为这两个元素有联系,把它们划归为同一个集合。 最后看看能划分出多少个不同的集合。本道题,可以认为有两个集合,异性和同性。给出关系,希望你检查这两个集合有没有连接,即有没有同性恋。大体思路: ‘合并’操作, ‘查找’操作不变。设置一个sex[] 数组,sex[i]
阅读全文
posted @
2012-03-10 10:58
hrbust_09zhangyabin
阅读(823)
推荐(0)
hdu1272---------------------并查集 + 判联通
摘要:这道题给出了一些点和边的信息,让你判断是否能够组成一个无环的联通集合,且这个唯一的集合可以为空。你需要做:1,判是否成环, 只要输入的边的两个点有共同的父节点,那么着两个点就成环了。2,判联通,只要最后判断根节点的总数为1即可。这道题花了我一上午,WA了5次。前两次是我不知道判联通,该! 后几次是太粗心了,初始化该写100000,却写成了10000! 累死我了,怎么也找不出原因!唉,悲剧啊注意若只输入0 0,则输出YesAC代码:#include<stdio.h>int set[100005];int flag[100005];int temp;int find(int x){in
阅读全文
posted @
2012-03-09 13:56
hrbust_09zhangyabin
阅读(234)
推荐(0)
lig1073------------------------第二道并查集
摘要:这道题和上一道很类似。第一道会了,第二道很快就AC了!不同的是,上一道是找有多少个不相交集合。 求集合的数量。 这一道是求某个确定集合中的元素个数。不难,中间遇到的一个小麻烦,是因为对基础概念理解不深。http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1073AC代码:#include<stdio.h>int set[50005];int find(int x){int r;r=x;while(set[r]!=r)r=set[r];return r;}void merge
阅读全文
posted @
2012-03-08 21:50
hrbust_09zhangyabin
阅读(137)
推荐(0)
hdu1232-------------------------简单并查集
摘要:题意:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 注意:两个城市之间可以有多条道路相通,也就是说3 31 21 22 1这种输入也是合法的当N为0时,输入结束,该用例不被处理。对每
阅读全文
posted @
2012-03-08 21:45
hrbust_09zhangyabin
阅读(125)
推荐(0)
dfs----------------hdu2553 改进版八皇后问题
摘要:终于明白前一个八皇后为什么跑那么慢了,在递归上逻辑混乱。dfs(step)求的就是第step层,可以放置皇后的位置。而我刚刚又很贱的去for(i=1;i<=step;i++)重新求了一下第1行到第step行,已经排好的棋盘的合法性。 无语,当然是合法的了。 于是,理清思路,去掉一层循环。速度就上去了。汗,原来时间复杂度是0(n*n*n),现在是0(n*n)。唉,还是基础不牢固。AC代码:31ms#include<stdio.h>#include<string.h>int a[105][105]; //该位置没有皇后就是0, 有皇后为1 int n;int coun
阅读全文
posted @
2012-03-07 14:14
hrbust_09zhangyabin
阅读(477)
推荐(0)
dfs----------------八皇后问题
摘要:今天上午用深搜算法敲了一个N皇后,什么剪枝都没有。算法很朴素,虽然运行良好。但耗时很久!贴别是当我看着它求解n=8时,整整用了3秒才递归出来。快笑死我了,用它来刷题,绝对废了~~~好吧,代码先放在这里,以后好好修改它!#include<stdio.h>#include<string.h>int a[105][105]; //该位置没有皇后就是0, 有皇后为1 int n;int count;int s[105]; //s[i]=j; i表示第i行,j表示第i行中,第j个位置有皇后void dfs(int step) //探索第step行皇后的位置 {int i,j,k;
阅读全文
posted @
2012-03-07 12:12
hrbust_09zhangyabin
阅读(400)
推荐(0)
第三道深搜-----------hdu1016
摘要:简单深搜。每次对第step个位置进行测试,for(i=2;i<=n;i++){ if(第i个点没有被访问过,并且和为质数) result[step]=i;//则将这个数放入step的位置visit[i]=1;//并且对第 i 个数进行标记,以后不再访问 dfs(step+1);//对下一个点按相同规则进行访问}我发现,深搜可以这样理解: 以某一个点为源点按确定的规则进行搜索。如果他的下一个邻接点可行(没有被访问过,且符合规则),则记录这个点,并标记。 然后,重新以该点为新的源点进行搜索。 如果不可行,则退回到上一步,继续按规则进行所示。直到满足结束条件。DFS即,每次一搜到底,不行就重新
阅读全文
posted @
2012-03-04 11:30
hrbust_09zhangyabin
阅读(191)
推荐(0)
简单DP-----------lig1147
摘要:今天一上午都在处理以前遗留下来的问题。以前不会的,无从下手的一下子都AC 了!好爽啊这道题是个简单动规,和数塔类似。动态转移方程 d[i][j]=min(d[i-1][j], d[i][j-1]) + d[i][j];最后输出d[n][n]即可。AC代码:#include<stdio.h>#include<string.h>//int data[1002][1002];int d[1002][1002];int n;int main(){int i,j;while(scanf("%d",&n)!=EOF){memset(d,100,sizeo
阅读全文
posted @
2012-03-03 09:59
hrbust_09zhangyabin
阅读(117)
推荐(0)
第二道简单深搜DFS-------------lig1143
摘要:说起lig1143这道题,大有渊源,光代码都编了5次,可谓一波三折。早在这道题出来时,我就试图去做。但那时还不会DFS,无从下手。想用栈解决,又太麻烦了!终于在掌握深搜之后,AC了。这道题不用任何剪枝,最基础的。可以说,是我第一道自己写出来的。本想现在写一下,对深搜,广搜的理解。算了,等多算几道题之后再写感悟吧!AC代码,以后多看看,加深理解:#include<stdio.h>#include<string.h>int map[1002][1002]; //用来记录高度 int map1[1002][1002]; //用来标记。初始化为0, 0表示没有走过,走过之后都标
阅读全文
posted @
2012-03-03 08:59
hrbust_09zhangyabin
阅读(196)
推荐(0)
第一道深搜------------hdu1010
摘要:这几天一直在研究深搜,各种走迷宫。但归类一下,我用的解决方法就两种:1,非递归,用栈 2,递归第一次按照数据额结构上的算法,用栈写了一个160行的走迷宫。复杂!写完之后,自己再想改就看不懂了!无语...........我知道递归和回溯简单,但自己一直纠结于函数的返回值问题,心里没搞明白,不敢用。后来在《算法设计上》看到一句话‘在用递归算法实现时,将节点作为参数,这样参数栈就能存储现有的节点’,顿时泪流满面啊!!我一直忘了,在函数递归时会自动建立一个参数栈。每次调用函数时,都会将参数入栈,回溯时参数自动出栈。我不用再杞人忧天,费劲儿的自己建栈了!唉,可以归结为基础不牢固,............
阅读全文
posted @
2012-03-02 20:54
hrbust_09zhangyabin
阅读(205)
推荐(0)