随笔分类 -  数据结构和算法

Floyd-Warshall算法的理解
摘要:Floyd算法可以求图内任意两点之间的最短路径,三重循环搞定,虽然暴力,但是属于算法当中最难的动态规划的一种,很有必要理解。花了一晚上和半个下午专门看这个,才看个一知半解,智商被碾压没办法。我一直怀疑这种办法会不会漏情况,是不是一定正确,脑子里想特殊用例,却把脑子想乱了。收藏这么几个网址,从数学证明... 阅读全文

posted @ 2014-09-19 16:19 RAUL_AC 阅读(459) 评论(0) 推荐(0)

基于邻接矩阵的拓扑排序--升级版
摘要:升级版不用栈,用递归来列举出所有的拓扑序列,循环内嵌套递归的思想值得好好领悟!例题:若干士兵站队,已知一些约束的关系,比如A必须站在B前面,B必须站在F前面等。求所有可能的站队方式输入:所有的约束关系,比如AB(表示A必须站在B前面)HJ输出:列出所有的站队方式测试用例:代码: 1 #include 2 #include 3 4 #define MAX_VERTEX_NUM 100 5 6 int ver_num; 7 int indeg[MAX_VERTEX_NUM]; 8 int help[MAX_VERTEX_NUM]; 9 int graph[MAX_VERTEX_NUM][M... 阅读全文

posted @ 2013-08-20 23:24 RAUL_AC 阅读(321) 评论(0) 推荐(0)

基于邻接矩阵的拓扑排序
摘要:总结下算法好了:(1)构图:每个活动是一个顶点,如果A必须排在B前面,那么有边从顶点A指向顶点B,顶点B的入度+1(2)遍历所有顶点,将入度为0的顶点入栈(3)如果栈不为空,则将栈顶出栈,然后将该顶点从图中删掉,即该点指向的点的入度-1,如果减后为0则入栈,重复(3)简单版的代码,只能举出一种拓扑排序: 1 #include 2 #include 3 4 #define MAX_VERTEX_NUM 100 5 6 int ver_num; 7 char vertex[MAX_VERTEX_NUM]; 8 int indeg[MAX_VERTEX_NUM]; 9 int graph[M... 阅读全文

posted @ 2013-08-20 21:56 RAUL_AC 阅读(846) 评论(0) 推荐(0)

Dijkstra算法构造单源点最短路径
摘要:迪杰斯特拉(Dijkstra)算法是求从某个源点到其余各顶点的最短路径,即对已知图 G=(V,E),给定源顶点 s∈V,找出 s 到图中其它各顶点的最短路径。我总结下核心算法,伪代码如下:Dijkstra(){ 初始化Dist、Path、final // 每次求得v0到某顶点v的最短路径 while (图的顶点数-1) { 1. 找到非最短路径顶点集中距V0最近的顶点v 得到其顶点下标和距离 将v加入到最短距离顶点集合中 打印相关内容 2. 依次修改其它未得到最短路径顶点的Dist[k]值 ... 阅读全文

posted @ 2013-08-17 22:58 RAUL_AC 阅读(493) 评论(0) 推荐(0)

Kruskal算法构造最小生成树
摘要:Kruskal算法来构造最小生成树,我总结了分为以下步骤:(1)建图,构造Kruskal边集,边集元素应该包括该边的起始顶点、终止顶点、权值;(2)将边集按权值从小到大的顺序进行排序;(3)从小到大依次从Kruskal边集中取边加入最小生成树集合,判断条件:将该边加入最小生成树集合,与生成树集合中原有的边不构成环;(4)最小生成树集合中元素(构成生成树的边)的个数为原图顶点数-1时,代表最小生成树构造完毕。Kruskal核心伪代码如下:Kruskal(MGragh *Gra){ 对Kruskal边集按权值从小到大排序 for (边集) { // 判断边集中的边能... 阅读全文

posted @ 2013-08-16 22:03 RAUL_AC 阅读(1647) 评论(0) 推荐(0)

马踏棋盘算法的实现
摘要:要求:国际象棋的棋盘为N*N的方格棋盘,现将“马”放在任意指定的方格中,按照“马”走棋的规则将“马”进行移动。要求每个方格只能进入一次,最终使得“马”走遍棋盘N*N个方格。关于马的走法见下图:主要练习的是递归的思想,伪代码如下:DFS(int x, int y, int tag){ // 将该格子赋值为当前的步数 chess[x][y] = tag; // 保留原来数据x y 将x1 y1代入递归 int x1=x; int y1=y; // 结束条件 if (tag == 棋盘格子数){ return ture; } // ... 阅读全文

posted @ 2013-08-15 23:29 RAUL_AC 阅读(1227) 评论(0) 推荐(0)

基于邻接矩阵的图的建立与遍历
摘要:以上图为例,通过邻接矩阵的方式存储该图,并写出建立图和遍历图的代码``代码的实现比较简单和基础,主要用于巩固和复习数据结构相关知识。#include #include #define MAX_VERTEX_NUM 100#define MAX_VERTEX_NAMELEN 100typedef struct{ char name[MAX_VERTEX_NAMELEN];}VerType;// 图的邻接矩阵存储结构typedef struct{ int VertexNum,EdgeNum; // 顶点数,边数 VerType Ver... 阅读全文

posted @ 2013-08-13 22:43 RAUL_AC 阅读(777) 评论(0) 推荐(0)

哈夫曼编码的实现
摘要:实现方案:1. 建立哈夫曼树(1)统计各个字符出现次数,按次数从小到大的顺序生成队列;(2)每次获取队列前两个节点(即队列中字符出现次数最少的两个),同时队头前移两位,将它们的字符出现次数相加,得到一个新节点,插入到队列合适位置;(3)当队列中仅剩一个节点时,哈夫曼树构造完毕,该节点即为树的根节点。2. 建立哈夫曼编码表(1)从哈夫曼树根开始遍历,遍历结束的同时编码表也构造完成,整个过程用递归实现,注意结束条件为遍历到叶子节点;(2)如果当时节点的左孩子不为空,则code[k]='0',递归遍历其左子树;(3)如果当时节点的右孩子不为空,则code[k]='1' 阅读全文

posted @ 2013-08-12 23:01 RAUL_AC 阅读(918) 评论(0) 推荐(0)

线索二叉树的建立和遍历
摘要:为充分利用二叉树节点,引入线索二叉树,将左孩子指针为空时指向前驱,将右孩子指针为空时指向后继。输入:ABC``D``E`F``(`用空格替代)中序遍历结果:CBDAEF代码实现中的部分挺巧妙的,偶尔可以翻出来看看,琢磨琢磨。 1 #include 2 #include 3 4 // 线索存储标志位 5 // Link(0) 左右孩子 6 // Thread(1) 前驱后继 7 typedef enum{Link,Thread} TAG; 8 9 // 线索二叉树节点结构 10 typedef struct BiThrNode 11 { 12 char da... 阅读全文

posted @ 2013-08-12 00:33 RAUL_AC 阅读(567) 评论(0) 推荐(0)

二叉树的建立和遍历
摘要:今天复习了二叉树的相关知识,写了点简单的二叉树建立和遍历的代码,作为备忘`` 1 #include 2 #include 3 4 #define MAX_TREENODE_NUM 100 5 6 // 二叉树节点结构 7 typedef struct bitnode 8 { 9 char data; // 节点存储的数据 10 struct bitnode *lchild; // 左孩子 11 struct bitnode *rchild; // 右孩子 12 }bitnode,*bitree;... 阅读全文

posted @ 2013-08-11 15:21 RAUL_AC 阅读(764) 评论(0) 推荐(0)

导航