- 博客(16)
- 资源 (4)
- 收藏
- 关注
原创 08-图9 关键活动 (30分)
我的思路,正向以最短完成时间和入度为参数做一遍拓扑排序;逆向以最长完成时间和出度为参数完成一边拓扑排序。出现了几个问题:判定说多起点多种点判定有误,同时也有段错误;自己验证的时候,在完成第一遍拓扑排序之后,发现以邻接表存储的图,其表头的最后一个丢失了(比如有1~12个表头,做完一次拓扑排序之后,第12个就读不出来了…),一直未解决。#include #include typede
2015-11-09 22:53:13 2085
原创 08-图8 How Long Does It Take (25分)
简单的拓扑排序。基础思路是这样的,对每个节点,都有一个时间参数,用来记录从起始到这个节点总共所需的最短时间。由于规矩是只有把该节点所有的入度给做完了,才能执行这个节点。所以每个节点都是等于它的入度节点的以及路径权重相加的最大值。利用拓扑排序算法就可以做了。注意多起始节点和多终止节点怎么处理的问题。#include #include typedef struct _
2015-11-09 22:48:00 1088
原创 08-图7 公路村村通
最小生成树问题,直接用prim算法就好。关于prim算法和Dijkstra算法,真心超级像,dijkstra算法中,dis为节点到源点s的距离,所以在每次更新的时候都要把之前累加的距离与这次的权重相加;prim算法,dis指的是到树的最短距离,所以每次更新的时候,只要将权重写进去了。呃,写的清楚点,是这样 对dijkstra算法(假设s连着x1,x2,x1连着x3,x2连着x4),
2015-11-09 22:35:13 565
原创 07-图6 旅游规划
若没有价格这个选项,我们用来记录的table是这样的(注意,不是指保存数据的结构,而是用来记录的table)know dispre 在加了价格之后,会变成这样 knowdis pre prix0
2015-11-09 22:27:36 631
原创 07-图5 Saving James Bond - Hard Version
这个题是hard版本的007逃亡,具体要求是,不仅要判断能不能让007逃出孤岛,还要输出最短的逃出路径。在简单版本中,利用深度优先或者广度优先都能进行判断,但若要输出最短的逃出路径,深度优先显然不合适了,因为它是一条道走到黑的…先来分析节点和路径,节点很明显,每一个鳄鱼,路径还是和简单版本的一样,能跳过去的就是一条路径。这里其实可以看出,每一条路径只有“存在”和“不存在”两种状态,整张
2015-11-09 22:19:04 1965
原创 07-图4 哈利·波特的考试
这道题,一看之下就是一个多源有权图求最小距离的题目。这么说吧,它这里要求对于任意一个起始点Ai,到距离它最远的点的距离Di;,然后在这K个Di中,找到一个最小的。(起点是Ai的最短路径的定义是这样的:求Ai到其他所有节点的最短路径→就是Ai到最远节点的最短路径)。认清了题目的本质之后,可以选择调用N次Dijkstra算法(K是Vertex数目),或者直接使用Floyd算法。因为我一
2015-10-31 10:30:29 739
原创 06-图3 六度空间
判断的时候超时了…= - 主题是一个BFS,有两个要点,在什么数遍历到的点,以及如何数层数。利用两个变量,tail和last。tail记录下一层的最后一个值,last记录这一层的最后一个值。当出队列的时候,若是该值等于last,层数即可自加一,并且让last=tail(上了一层了),tail的赋值则和每次的入队列一起即可。= - 居然超时了…明儿按照老师给的码一边试试。PS:第
2015-10-29 23:17:22 539
原创 06-图2 Saving James Bond - Easy Version
都说了是easy version了…主题是一个DFS,重点是看什么时候跳出。顺便说一句,这个题目中的图,由于点和点之间的边是在经历一定判断之后才建立的,所以可以直接用一个数组把这些点存了,不用在意当下他们的关系。后面根据给出条件看这个点是不是能够和另一个点连起来。#include #include #include #define R 15typedef struct _po
2015-10-29 23:13:49 444
原创 06-图1 列出连通集
这个其实主要也是熟悉一下图的一些基本操作,包括它的建立以及遍历。建立的话,可以用邻接矩阵或者邻接表法。前者适合稠密的图,后者适合稀疏的图。遍历的话,可以用深度优先搜索(DFS,需要递归,类比先序遍历),或者广度优先搜索(BFS,不用递归,类比层序遍历)这里因为需要按照顺序打印,所以要么用邻接矩阵,要么用邻接表(这个表不能是一般的链表了,而要是最小堆)。为了方便,现在使用邻接矩阵。#
2015-10-28 21:59:04 1583
原创 05-树9 Huffman Codes
这题目看起来挺大的,其实细细分析起来,主要是这么几个。首先,如何根据各个字符出现的频率,求出WPL;其次,如何比较学生的输入是否是正确的最优编码。对第一个问题,其实可以发现,在利用WPL最优算法构造Huffman Tree的时候,除了叶节点外的所有节点的频率之和就是WPL(证明略)。因此,只要写个最小堆,塞进去之后,拿出两个最小值来,求和,然后重复。只要把这些和都加起来,就是WPL了。
2015-10-28 21:38:27 2675 1
原创 05-树8 File Transfer
这个其实是利用集合的概念,利用一个一维数组来表示。数组的下标和元素对应,其中存储的值为各自的父亲的下标(正数)。若为负数,则表示这个节点是根,根所在节点的值的绝对值表示这棵树的总节点数。因此,连接时,找到两个元素各自的根节点,若相同就不管了,否则,将较小的树连到较大的树上(小树根节点的值等于大树的根节点的下标) 。 查找是否属于同一棵树,找到两个元素的根节点,比较即可。另外注意不在这个总的
2015-10-28 21:35:43 532
原创 05-树7 堆中的路径
这道题,唯一需要注意的就是,insert操作是需要从低向上过滤的。(Delete是从顶向下过滤的,虽然这里没有…#include #include typedef struct _prique{ int *p; int nowsize; int maxsize;}PriQue;void insert_maxque(PriQue *root,int record);//最大堆
2015-10-28 21:18:42 429
原创 04-树6 Complete Binary Search Tree 完全二叉搜索树
这道题大意是这样,输入N个不同的非负整数,需要将其按照二叉搜索树的规则,排成一个完全二叉树。二叉搜索树是指每个每个节点的所有左元素都比它小,右边都比它大;完全二叉树指的是,除了最后一层,其余每一层都满,最后一层从左往右排。 之后层序遍历,输出。一开始想法是,构造,然后输出。并不能码出来(水平不够)之后去查了别人的算法,又被别人的机智惊艳到了! 基本想法是这样,完全二叉树有这
2015-10-24 23:02:19 4640 2
原创 04-树5 二叉平衡树
这个题目的要点就是二叉平衡树,说白了就是让我们熟悉一下对二叉平衡树的操作。二叉平衡树就是在二叉树的基础上,需要满足每个节点的左子树和右子树的高度差不大于1.也就是说,一旦出现差为2(或者-2)的情况,就需要对树进行调整。一共有四种调整方法,单左旋转,单右旋转,双左右旋转以及双右左旋转。其中,后面两个双旋转可以由前面两个单旋转拼接而成。因此,树的每个节点都必须带有一个表示自身高度的参数(heig
2015-10-24 22:29:21 506
原创 04-树4 是否是同一棵二叉搜索树
在写这题的时候,一开始对输入和输入并不是很理解,自己写出来后,也各种报错,后来看了别人的程序才理解 输入 是包含了两次例子,一次是4个节点,判别2次,一次是2个节点,判别1次。Yes和No可以在待判别树输入后马上输出,不用放到最后一起输入。一开始看到这题,我的策略是比较笨的,把被判别树构造好之后,每次都去把待判别树构造一边,然后层序遍历两棵树,比较其结构。写出来之后,测试例子是正确的,
2015-10-24 22:14:40 1697
原创 初码代码的一点感想
在刷PAT题目的时候,遇到了一题是判断 两个二叉搜索树是否是同一棵树。一开始用的方法是最笨的,把两棵树都写出来,比较他们层序遍历之后的结果。测试了之后发现结果没问题,但是提交之后一直出现段错误= - 改了一天都改不掉= - bi狗了。后来网上学习了别人的方法,可以不用把第二棵树给写出来,只要在节点上加一个flag,比较时每次输入比较后,匹配的就把该位写1就好。anywa
2015-10-24 08:58:17 549
patch for Octave 4.00 ML-Stanford
2015-11-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人