1-1 If a directed graph G=(V, E) is weakly connected, then there must be at least |V| edges in G.

F

at least |V-1|

1-2 邻接矩阵作为有向图的存储结构,则某顶点的度就是该顶点所在列的非零元素的个数。

F

出度看行,入度看列,度是行加列

1-3 用邻接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关

F

捉虫,邻接矩阵只与结点个数有关,邻接表与结点和边都有关

2-1 图G如下,从A开始深度优先遍历该图,不可能的遍历序列是(      )。

image.png

ACDEB

2-2 通过对无向图进行先深搜索,可以判断该图是否是连通图,或找出图的连通分量及先深生成树。

深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。

无向图 G 的一个极大连通子图称为 G 的一个连通分量(或连通分支)。连通图只有一个连通分量,即其自身;非连通的无向图有多个连通分量。连通分量与连通分量之间没有任何边相连。深度优先遍历可以用来求连通分量。

由深度优先搜索得到的树为深度优先生成树。

深度优先生成树和广度优先生成树 (biancheng.net)

深度优先遍历与连通分量 | 菜鸟教程 (runoob.com)

2-3 用邻接表表示图进行广度优先遍历时,通常借助( )来实现算法

广度优先借助队列,深度优先借助栈

数据结构之图的遍历:深度优先遍历(DFS)_调用两次深度优先遍历算法才完成了-CSDN博客

算法:深度优先遍历和广度优先遍历_广度优先遍历和深度优先遍历-CSDN博客

2-4 

已知图的邻接表如下图所示,则从顶点v1出发广度优先遍历的结果是( )。

image.png

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

图2.png

输入样例:

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 }
View Code

 

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 }
View Code

 

 
posted on 2023-12-16 22:00  fmos  阅读(477)  评论(0)    收藏  举报