摘要: 数组初始化的时候常用for()循环,不过如果考虑效率的话,最好用memset(),下面简单介绍以下memset()。
函数原型:
void *memset(void *s, int ch, size_t n)
函数解释:将s中前n个字节替换为ch并返回s;
……
sizeof是C/C++中的一个操作符(operator),而不是函数……  阅读全文
posted @ 2012-08-07 23:38 小鼠标 阅读(3149) | 评论 (2)编辑 收藏
最小生成树,Prim算法。
具体可参阅:http://www.cppblog.com/hoolee/archive/2012/08/06/186482.html
代码如下:

posted @ 2012-08-07 11:23 小鼠标 阅读(112) | 评论 (0)编辑 收藏
最小生成树,Prim算法。
具体可参阅:http://www.cppblog.com/hoolee/archive/2012/08/06/186482.html
代码如下:

posted @ 2012-08-07 10:47 小鼠标 阅读(106) | 评论 (0)编辑 收藏
最小生成树有两个经典算法:Prim算法和Kruskal算法,Prim适合于点较少的图,对于一个节点数为N的连通图来说,其时间复杂度为O(N^2);Kruskal适合于边较少的图,对一个边为E的连通图来说,其时间复杂度为O(ElogE),因此要根据不同情况选择合适的算法。
这里说一下Prim算法。
Prim的具体步骤为把所有点分为两个部分:属于集合S,或不属于S,当所有点都属于S时,算法结束。
1.初始条件先将第一个点p0划到S中,然后利用p0关联的所有边更新cost[](sost[i]表示pi与S中点相连的最短的那条边长)
2.每次从sost[]中选出最小的那一个cost[i](i不能属于S),将i加入到S中,并利用与i相关的边更新cost[](已加入到S中的点不用再更新)
3.反复执行第二步,直到图连通。(我们知道一个有n个节点的图,最少只需要n-1条边就可以连通了,所以第二步会执行n-1次,每次都会在图中加入一条边)
关于Kruskal请参阅:http://www.cppblog.com/hoolee/archive/2012/08/04/186253.html
下面是zoj1203的Prim算法代码:

posted @ 2012-08-06 17:46 小鼠标 阅读(3112) | 评论 (0)编辑 收藏
这是实验室集训开始第一次比赛的D题。
题意描述:给你n张卡片,每张卡片正反面都有颜色(两面的颜色可能相同,或不同),将这些卡片放在桌面上,每次操作你可以将一张卡片翻面。问的是能否通过最少的翻面次数使得正面有一种颜色的数量>=卡片数的一半,并输出翻面次数。
解题的大致思路是,用A[]统计出所有可能出现的颜色以及该种颜色出现的总次数,用B[]统计正面的颜色以及该种颜色出现的次数。如果A[]中有某种颜色出现的次数>=(n+1)/2,说明通过若干次翻面操作我们是可以达到目的的,这时只需再参照B[],即可算出翻面次数。
思路很清晰,可是有一些不得不注意的细节。
1.当卡片两面的颜色相同时,只能统计一次。
2.数据量很大,查找时要用二分。
3.如果一种颜色在只在反面出现,B[]中是找不到它的。

以下是本题代码:
posted @ 2012-08-06 15:16 小鼠标 阅读(337) | 评论 (0)编辑 收藏
这里不再赘述了,关于最小生成树Kruskal算法可以参阅:http://www.cppblog.com/hoolee/archive/2012/08/04/186253.html
以下是本题代码:
posted @ 2012-08-04 16:40 小鼠标 阅读(118) | 评论 (0)编辑 收藏
这两天在做最小生成树,用的一直是Kruskal,不知道用Prim能把代码写的短点儿。。。
这是有些被催的一题,题中两个卫星连接的点之间可以理解为没有长度,偶错误的将卫星个数S理解为没有长度的边的个数,忘记了它们之间是有1之差的。O_O
关于Kruskal,可以先参阅:http://www.cppblog.com/hoolee/archive/2012/08/04/186253.html
以下是本题代码:
posted @ 2012-08-04 16:21 小鼠标 阅读(266) | 评论 (0)编辑 收藏
最小生成树有两种算法:Prim和Kruskal,这里说一下Kruskal算法。
其具体算法描述为(我们假设给定的图是连通的):
1.初始化总花费allcost=0
2.将所有边按边长len从小到大的顺序排序
3.从头到尾依次遍历个边edge[i], 如果该边关联的两个定点不属于同一个集合,则将这两个集合合并,并更新allcost。
Kruskal算法牵涉到集合操作,包括集合的建立和集合的合并,这里用并查集解决,下面简单介绍以下并查集。
并查集用森林来表示,他有以下操作:
初始化:把每个节点所在结合初始化为自身。
查找:查找元素所在的集合,即根节点
合并:将两个在不同集合的元素合并为一个集合,为了保持数的深度的平衡性,在合并之前,应判断两个集合树的深度,如果深度不同,应将深度小的合并到深度大的上面。
关于维持集合树深度的问题,还有另一种做法,就是合并集合的时候并不考虑树的深度,而是在查询的时候改变树的深度。因为没有写过,这里不多说了。
下面是poj1258的代码,最直接的最小生成树。
posted @ 2012-08-04 14:24 小鼠标 阅读(1586) | 评论 (0)编辑 收藏
大数问题。C语言中没有大整数类型,当一个数超过long long时我们就没办法直接表示,只能通过数组模拟(字符数组,或者整形数组),与Java相比,这一点真是够折磨人的,记得今年省赛的时候,有一题是关于大数的,有人直接用Java中的BigInteger类,很轻松的就搞定了,C语言真是无法望其项背。这里我们用C解一道大数乘法题,其实模拟大数运算就是在模拟小学生算算术,这一题只牵涉到了加法和乘法,我就说着两种操作。
加法Add():
1.对位,将权值相同的各位对其
2.相加,将相应的每一位相加
3.进位,从低位到高位依次进位
乘法:a*b
乘法是在加法的基础上完成的,跟我们手算乘法的过程一样,依次将b的每一位与a相乘,加到一起就行了。需要注意的是b中的每一位权值是不一样的。
为了对位方便,我们通常是将数字倒置过来,即低位在左边,高位在右边。字符串处理都是些细节,不小心就会犯错误。
以下是poj3167的代码:
题意:给两个数K、M,求n,使得M^n的第K为是数字7。
posted @ 2012-08-04 09:31 小鼠标 阅读(1148) | 评论 (0)编辑 收藏
最直接的广度优先搜索题。求最短路一般用广搜,广搜要用到队列;与广搜对应的是深搜,深搜要用到栈,它能找到所有路,这里不展开说了。刚入门的同学可以先看看队列这种数据结构。
无论广搜还是深搜,走过的节点一定要标记,以免多次走过同一个节点。
以下是本题代码:
posted @ 2012-08-02 19:51 小鼠标 阅读(200) | 评论 (0)编辑 收藏
仅列出标题
共13页: First 4 5 6 7 8 9 10 11 12 Last 
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

随笔分类(111)

随笔档案(127)

friends

最新评论

  • 1. re: 线段树
  • 是这个样子的,所以在OJ有时候“卡住”了也不要太灰心,没准真的不是自己的原因呢。
    加油,祝你好运啦!
  • --小鼠标
  • 2. re: 线段树
  • 对于编程竞赛来说,Java所需时间一般为C/C++的两倍。合理的竞赛给Java的时间限制是给C/C++的两倍。
  • --伤心的笔
  • 3. re: poj1273--网络流
  • 过来看看你。
  • --achiberx
  • 4. re: (转)ubuntu11.10无法启动无线网络的解决方法
  • 膜拜大神。。查了一个下午资料终于在这里解决了问题。。神牛说的区域赛难道是ACM区域赛。。?
  • --Hang
  • 5. re: 快速排序、线性时间选择
  • 博主,谢谢你的文章。你的方法可以很好的处理分区基准在数组中重复的情况,书上的方法遇到这种输入会堆栈溢出。书上给出了解释但给的方法貌似不简洁。
  • --lsxqw2004

阅读排行榜