F
at least |V-1|
1-2 邻接矩阵作为有向图的存储结构,则某顶点的度就是该顶点所在列的非零元素的个数。
F
出度看行,入度看列,度是行加列
1-3 用邻接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关
F
捉虫,邻接矩阵只与结点个数有关,邻接表与结点和边都有关
2-1 图G如下,从A开始深度优先遍历该图,不可能的遍历序列是( )。
ACDEB
2-2 通过对无向图进行先深搜索,可以判断该图是否是连通图,或找出图的连通分量及先深生成树。
对
深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。
无向图 G 的一个极大连通子图称为 G 的一个连通分量(或连通分支)。连通图只有一个连通分量,即其自身;非连通的无向图有多个连通分量。连通分量与连通分量之间没有任何边相连。深度优先遍历可以用来求连通分量。
由深度优先搜索得到的树为深度优先生成树。
深度优先生成树和广度优先生成树 (biancheng.net)
深度优先遍历与连通分量 | 菜鸟教程 (runoob.com)
2-3 用邻接表表示图进行广度优先遍历时,通常借助( )来实现算法
广度优先借助队列,深度优先借助栈
数据结构之图的遍历:深度优先遍历(DFS)_调用两次深度优先遍历算法才完成了-CSDN博客
算法:深度优先遍历和广度优先遍历_广度优先遍历和深度优先遍历-CSDN博客
2-4
已知图的邻接表如下图所示,则从顶点v1出发广度优先遍历的结果是( )。
v1v0v2v3
v1->0-->v0;v0->1-->;v0->2-->v2;v0->3-->v3
7-1
以邻接矩阵作存储结构,编写程序对给定的无向图(图中包含n个顶点,编号为0至n-1
)进行深度优先遍历,并在遍历的过程中计算图G的连通分量个数及边的数目。
本题限定在遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小
的一个进行访问,以顶点0
为遍历起点。
邻接矩阵的类型描述
#define MaxVexNum 20 //最大顶点数目
typedef struct
{ int arcs[MaxVexNum][MaxVexNum];
int vexnum, arcnum;
}AMGraph;
输入格式:
第一行输入图的顶点数
和边数
。
接下来每行代表一条边,输入边依附的两个顶点的编号
。各边输入先后次序无要求。
输出格式
输出分三行
- 第一行 深度优先遍历序列。序列中每个顶点编号后跟一个空格。
- 第二行 连通分量个数
- 第三行 边数
对于下面给出的无向图G
输入样例:
9 8
0 1
0 2
1 3
3 4
2 5
2 6
5 6
7 8
输出样例:
0 1 3 4 2 5 6 7 8
2
8
代码:

1 #include <iostream> 2 using namespace std; 3 #define mvnum 20 4 typedef struct { 5 int arcs[mvnum][mvnum]; 6 int vnum, arcnum; 7 }amggragh; 8 9 bool visited[mvnum]; //访问标志数组, 其初始值为false 10 11 void dfs(amggragh g,int v) { 12 cout << v<<" ";//输出该点 13 visited[v] = true;//标记为已访问 14 for (int i = 0; i < g.vnum; i++) { 15 if (g.arcs[v][i]==1 && visited[i] == 0) {//遍历邻接点,如果和邻接点有边,且未被访问 16 dfs(g, i);//递归访问该邻接点 17 } 18 } 19 } 20 void dfs_d(amggragh g) {//深度优先搜索操作 21 int i; 22 int cnt = 0;//连通图计数 23 for (i = 0; i < g.vnum; i++) { 24 if (visited[i] == 0) {//遍历所有点,如果该点未被访问 25 dfs(g, i); 26 cnt++; 27 } 28 } 29 cout << endl; 30 cout << cnt; 31 } 32 int main() 33 { 34 amggragh g; 35 int v1, v2; 36 cin >> g.vnum >> g.arcnum; 37 for (int i = 0; i < g.arcnum; i++) { 38 cin >> v1 >> v2; 39 g.arcs[v1][v2] = 1;//该边存在 40 } 41 dfs_d(g); 42 cout << endl; 43 cout << g.arcnum; 44 45 }
7-2
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入格式:
两个整数,N和K
输出格式:
一个整数,农夫抓到牛所要花费的最小分钟数
输入样例:
在这里给出一组输入。例如:
5 17
输出样例:
在这里给出相应的输出。例如:
4
代码:

1 #include <iostream> 2 #include<queue> 3 #define maxn 100001 4 using namespace std; 5 int d[3]; 6 bool visited[maxn] ; 7 int res[maxn]; 8 void bfs(int vs, int ve) {//起点和终点 9 queue<int> q; 10 int vn; 11 q.push(vs); 12 visited[vs] = 1; 13 while (!q.empty()) {//队列不为空q.empty()为空,返回值为1 14 vn = q.front();//取出队列的头,和ve作比较 15 q.pop(); 16 if (vn == ve) 17 break; 18 d[0] = vn - 1; 19 d[1] = vn + 1; 20 d[2] = vn * 2; 21 for (int i = 0; i < 3; i++) { 22 if (d[i] >= 0 && d[i] < maxn && visited[d[i]] == 0) {//注意条件!!一开始第一个条件没有写成大于等于。。。 23 q.push(d[i]); 24 visited[d[i]] =1; 25 res[d[i]] = res[vn] + 1; 26 } 27 } 28 } 29 cout << res[ve]; 30 } 31 int main() 32 { 33 int n, k; 34 cin >> n >> k; 35 bfs(n, k); 36 }