码迷,mamicode.com
首页 > 其他好文 > 详细

ds第六章学习记录

时间:2020-06-14 18:36:30      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:--   cpp   weixin   深度优先搜索   初始化   直接   函数   方便   标记   

图的定义

  • 邻接矩阵     结构简单,操作方便

             稀疏图将浪费大量的空间

  • 邻接表  (类比 树 --- 孩子表示法?)  

                           操作复杂

 

注意邻接链表的结构体定义 --- 不要搞混不要被绕晕啊!    嵌套太多了 有时用指针 还要看清给的int还是char

typedef struct ArcNode
{
	int adjvex; 
	struct ArcNode * nextarc; 
	Otherinfo info;	
}ArcNode; 

typedef struct VNode 
{
	VerTexType data;
	ArcNode *firstarc; 
}VNode,AdjList[MVNum]; 

typedef struct 
{
	AdjList vertices; 
	int vexnum,arcnum;	
}ALGraph;

  

 

深度优先遍历

利用递归思想          连通图与非连通图的区别

--- 非连通图 遍历每个连通分量 !  (注意遍历的顺序呀

void DFS(AMgraph G,int v) 
{//图G为邻接矩阵类型,从第v个顶点出发深度优先搜索遍历图G
	cout<<v;
	bool *visited = new bool[MVNum];
	visited[v]=true; 
	int w;
	for(w=0;w<G.vexnum;w++) 
	if((G.arcs[v] [w] !=0)&&(!visited[w])) DFS(G,w); 
	//G.arcs[v] [w] ! =0表示w是v的邻接点, 如果w未访问, 则递归调用DFS
} 

  

广度优先遍历

队列    (注意队列不为空 循环 --- 直到所有顶点都被遍历

先访问再入队?还是直接入队

 

 

 

PTA笔记

1.在有向图的邻接表中,从一bai顶点出发的弧链du接在同一链表中zhi,邻接表中结点的个数恰为图中弧的数目dao,所以顶点入度之和为弧数和的一倍,若为无向图,同一条边有两个结点,分别出现在和它相关的两个顶点的链表中,因此无向图的邻接表中结点个数的边数的2倍

 

2

    • prim算法是通过每步添加一条边及其相连的顶点到一棵树,从而逐步生成最小生成树;
    •  Kruskal 算法是维护一个森林,每一步把两棵树合并成一棵;

https://blog.csdn.net/weixin_43751983/article/details/103392635

 

3

全连通图的定点 n 和边数 m 
m = n(n-1)/2
那么du边 m = 22 时, 图 G:
n(n-1)/2 >= 22
n >= 8
而且,当 n = 7 时,全连通图 G‘ 的边数 m = 21
当我们把第zhi 8 个定点加上来,必然还dao要再在这个定点和上面7个定点相连,以便构成第 22 边
(8个顶点不足以构成22边非连通图)
加上第 9 个定点后,可以在 (8, 9) 之间构成第22边,或者,选择 8, 或 9 作为孤立点,构成非连通图
至少有 9 个顶点

 

 

PTA作业和实践  007

在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑袋跳上岸去!(据说当年替身演员被最后一条鳄鱼咬住了脚,幸好穿的是特别加厚的靴子才逃过一劫。)

设鳄鱼池是长宽为100米的方形,中心坐标为 (0, 0),且东北角坐标为 (50, 50)。池心岛是以 (0, 0) 为圆心、直径15米的圆。给定池中分布的鳄鱼的坐标、以及007一次能跳跃的最大距离,你需要告诉他是否有可能逃出生天。

输入格式:

首先第一行给出两个正整数:鳄鱼数量 N(≤)和007一次能跳跃的最大距离 D。随后 N 行,每行给出一条鳄鱼的 ( 坐标。注意:不会有两条鳄鱼待在同一个点上。

输出格式:

如果007有可能逃脱,就在一行中输出"Yes",否则输出"No"

sample

14 20
25 -15
-25 28
8 49
29 15
-35 -2
5 28
27 -29
-8 -28
-20 -35
-25 -20
-13 29
-30 15
-35 40
12 12
yes


4 13
-12 12
12 12
-12 -12
12 -12
no
 
  1. 存储结构 --- 对于每一个点 都有x、y坐标
  2.  第一步能否可以跳过
  3. 递归 能否从某一点跳到某一点 重复步骤
      • 深度优先遍历时,对每一个访问的结点设置该节点已经访问过,并判断从该节点是否可以一次跳到岸边 可以的话直接返回

      • 否则 对其他结点判断,如果该节点可以到达且没有访问过 就对这个结点进行深度优先遍历

  4. 能否跳到河对岸

 

 

我的bug 

  1. 一开始没想到分开第一步单独写出来 想了很久 写了一堆乱七八糟的函数----------一定要想清楚才下手!
  2. visit数组记得要初始化为1! 死活写不出来
  3. 我先是用了结构体数组 想用指针去标记的 结果发现写不进数据 是因为我没有正确的给我的结构体数组分配空间 都成了空指针 然后我就把指针删去了 直接用静态数组 没必要那么复杂了

改进

  1. 判断007能否从A点直接跳到湖岸,当007步长大于A点到湖岸的距离时,说明可以到达换,即d>= 50-| x | 或者d>= 50-| y |
  2. 循环里可以加一个break 就是flag判断那里 节省一点时间 如果给的数据量变大就能看出好处了

https://www.cnblogs.com/X-Do-Better/p/9048604.html

 

ds第六章学习记录

标签:--   cpp   weixin   深度优先搜索   初始化   直接   函数   方便   标记   

原文地址:https://www.cnblogs.com/drgnibasaw/p/13125687.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!