第五章、图的遍历

第一节、深度与广度优先,究竟是指啥?(无向图)
p131 DFS遍历图

 1 #include <stdio.h>
 2 int book[101],sum,n,e[101][101];
 3
 4 void dfs(int cur)
 5 {
 6   int i;
 7   printf("%d ",cur);
 8   sum++;
 9   if(sum==n) return;
10   for(i=1;i<=n;i++)
11   {
12     if(e[cur][i]==1 && book[i]==0)
13     {
14       book[i]=1;
15       dfs(i);
16     }
17   }
18   return;
19 }
20
21 int main()
22 {
23   int i,j,m,a,b;
24   scanf("%d %d", &n, &m);
25
26   for(i = 1; i <= n; i++)
27     for(j = 1; j <= n; j++)
28       if(i==j) e[i][j]=0;
29         else e[i][j]=99999999;
30
31   for(i=1;i<=m;i++)
32   {
33      scanf("%d %d", &a, &b);
34      e[a][b]=1;
35      e[b][a]=1;
36   }
37
38   book[1]=1;
39   dfs(1);
40   getchar(); getchar();
41   return 0;
42 }
43
44 /*
45
46 5 5
47 1 2
48 1 3
49 1 5
50 2 4
51 3 5
52
53 */

相关修改:sum木有必要有。

 1 #include <stdio.h>
 2 int book[101],n,e[101][101];
 3
 4 void dfs(int cur)
 5 {
 6   int i;
 7   printf("%d ",cur);
 8   for(i=1;i<=n;i++)
 9   {
10     if(e[cur][i]==1 && book[i]==0)
11     {
12       book[i]=1;
13       dfs(i);
14     }
15   }
16   return;
17 }
18
19 int main()
20 {
21   int i,j,m,a,b;
22   scanf("%d %d", &n, &m);
23
24   for(i = 1; i <= n; i++)
25     for(j = 1; j <= n; j++)
26       if(i==j) e[i][j]=0;
27         else e[i][j]=99999999;
28
29   for(i=1;i<=m;i++)
30   {
31      scanf("%d %d", &a, &b);
32      e[a][b]=1;
33      e[b][a]=1;
34   }
35
36   book[1]=1;
37   dfs(1);
38   getchar(); getchar();
39   return 0;
40 }
41
42 /*
43 这组数据,使顶点四不连通
44
45 5 5
46 1 2
47 1 3
48 1 5
49 2 3
50 3 5
51
52 5 5
53 1 2
54 1 3
55 1 5
56 2 4
57 3 5
58
59 */

p134 BFS遍历图

 1 #include <stdio.h>
 2 int main()
 3 {
 4   int i,j,n,m,a,b,cur,book[101]={0},e[101][101];
 5   int que[10001],head,tail;
 6   scanf("%d %d", &n, &m);
 7
 8   for(i = 1; i <= n; i++)
 9     for(j = 1; j <= n; j++)
10       if(i==j) e[i][j]=0;
11         else e[i][j]=99999999;
12
13   for(i=1;i<=m;i++)
14   {
15      scanf("%d %d", &a, &b);
16      e[a][b]=1;
17      e[b][a]=1;
18   }
19
20   head=1;
21   tail=1;
22
23   que[tail]=1;
24   tail++;
25   book[1]=1;
26
27   while(head<tail)
28   {
29     cur=que[head];
30     for(i=1;i<=n;i++)
31     {
32       if(e[cur][i]==1 && book[i]==0)
33       {
34         que[tail]=i;
35         tail++;
36         book[i]=1;
37       }
38       if(tail>n) break;
39     }
40     head++;
41   }
42
43   for(i=1;i<tail;i++)
44     printf("%d ",que[i]);
45
46   getchar(); getchar();
47   return 0;
48 }
49
50 /*
51
52 5 5
53 1 2
54 1 3
55 1 5
56 2 4
57 3 5
58
59 */

第二节、城市地图——图的深度优先遍历(有向图)
p139 DFS求图中两顶点间的最短路径

 1 #include <stdio.h>
 2 int min=99999999, book[101], n, e[101][101];
 3
 4 void dfs(int cur, int dis)
 5 {
 6   int i;
 7   if(dis>min) return;
 8   if(cur==n)
 9   {
10     if(dis<min) min=dis;
11     return;
12   }
13
14   for(i=1;i<=n;i++)
15   {
16     if(e[cur][i] !=99999999 && book[i]==0)
17     {
18       book[i]=1;
19       dfs(i,dis+e[cur][i]);
20       book[i]=0;
21     }
22   }
23   return;
24 }
25
26 int main()
27 {
28   int i,j,m,a,b,c;
29   scanf("%d %d", &n, &m);
30
31   for(i = 1; i <= n; i++)
32     for(j = 1; j <= n; j++)
33       if(i==j) e[i][j]=0;
34         else e[i][j]=99999999;
35
36   for(i=1;i<=m;i++)
37   {
38      scanf("%d %d %d", &a, &b, &c);
39      e[a][b]=c;
40   }
41
42   book[1]=1;
43   dfs(1,0);
44   printf("%d",min);
45
46   getchar(); getchar();
47   return 0;
48 }
49
50 /*
51
52 5 8
53 1 2 2
54 1 5 10
55 2 3 3
56 2 5 7
57 3 1 4
58 3 4 4
59 4 5 5
60 5 3 3
61
62 */

p141 相关修改:能计算任意两顶点间的最短路径
并可使有向图,成为无向图

 1 #include <stdio.h>
 2 int min=99999999, book[101], n, e[101][101];
 3 int start,end; //
 4
 5 void dfs(int cur, int dis)
 6 {
 7   int i;
 8   if(dis>min) return;
 9   if(cur==end) //
10   {
11     if(dis<min) min=dis;
12     return;
13   }
14
15   for(i=1;i<=n;i++)
16   {
17     if(e[cur][i] !=99999999 && book[i]==0)
18     {
19       book[i]=1;
20       dfs(i,dis+e[cur][i]);
21       book[i]=0;
22     }
23   }
24   return;
25 }
26
27 int main()
28 {
29   int i,j,m,a,b,c;
30   scanf("%d %d", &n, &m);
31
32   for(i = 1; i <= n; i++)
33     for(j = 1; j <= n; j++)
34       if(i==j) e[i][j]=0;
35         else e[i][j]=99999999;
36
37   for(i=1;i<=m;i++)
38   {
39      scanf("%d %d %d", &a, &b, &c);
40      e[a][b]=c;
41      //e[b][a]=c; //添加这句,使之成为无向图 p141
42   }
43
44   scanf("%d %d",&start,&end); //最后一行,输入起点与终点
45   book[start]=1; //
46   dfs(start,0); //
47   printf("%d",min);
48
49   getchar(); getchar();
50   return 0;
51 }
52
53 /*
54 改编程序,使之能计算任意起点与终点间的最短路径
55
56 5 8
57 1 2 2
58 1 5 10
59 2 3 3
60 2 5 7
61 3 1 4
62 3 4 4
63 4 5 5
64 5 3 3
65 5 2
66
67 */

第三节、图的广度优先遍历
p144 广度优先求航班最少转机次数(设每边权值为1)

 1 #include <stdio.h>
 2 struct note
 3 {
 4   int x; //城市编号
 5   int s; //转机次数
 6 };
 7
 8 int main()
 9 {
10   struct note que[2501];
11   int e[51][51]={0}, book[51]={0};
12   int head,tail;
13   int i,j,n,m,a,b,cur,start,end,flag=0;
14   scanf("%d %d %d %d", &n, &m, &start, &end);
15
16   for(i = 1; i <= n; i++)
17     for(j = 1; j <= n; j++)
18       if(i==j) e[i][j]=0;
19         else e[i][j]=99999999;
20
21   for(i=1;i<=m;i++)
22   {
23      scanf("%d %d", &a, &b);
24      e[a][b]=1;
25      e[b][a]=1;
26   }
27
28   head=1;
29   tail=1;
30
31   que[tail].x=start;
32   que[tail].s=0;
33   tail++;
34   //book[1]=start;
35   book[start]=1;
36
37   while(head<tail)
38   {
39     cur=que[head].x;
40     for(i=1;i<=n;i++)
41     {
42       if(e[cur][i]!=99999999 && book[i]==0)
43       {
44         que[tail].x=i;
45         que[tail].s=que[head].s+1;
46         tail++;
47         book[i]=1;
48       }
49       if(que[tail-1].x==end)
50       {
51         flag=1;
52         break;
53       }
54     }
55     if(flag==1) break;
56     head++;
57   }
58
59   printf("%d\n",que[tail-1].s);
60
61   getchar(); getchar();
62   return 0;
63 }
64
65 /*
66
67 5 7 1 5
68 1 2
69 1 3
70 2 3
71 2 4
72 3 4
73 3 5
74 4 5
75
76 */



oj
以后整理。。。

top

时间: 2024-10-10 07:42:24

第五章、图的遍历的相关文章

第五章 图的遍历(深度遍历,广度遍历,城市地图,最少转机)

深度和广度优先搜索: 单词分解:首先是搜索 深度和广度:是针对图的遍历而言的 图:由顶点和边组成 图的遍历:把图中每一个顶点都访问一次 一: 输入: 5 5(顶点数,边数) 1 2 1 3 1 5 2 4 3 5 输出: 1 2 4 3 5 (按时间戳输出)深度遍历 1 2 3 5 4 (按时间戳输出)广度遍历 1 #include <stdio.h> 2 int map[10][10], book[10], n, m,sum; 3 void dfs(int cur) 4 { 5 int i;

数据结构导论之第五章图

一.图的概念 图的定义 1.图 在树形结构中,结点间具有层次关系,每一层结点只能和上一层中的至多一个结点相关, 但可能和下一层的多个结点相关.而在图结构中,任意两个结点之间都可能相关,即结点之 间的邻接关系可以是任意的图G:是由集合V和E组成,记成G=(V,E): V 是顶点集(非空):E 是边集 (可空);边是顶点的有序对或无序对;(边反映了两顶点之间的关系) 2.有向图 :边是顶点的有序对的图(图中每条边都用箭头指明了方向)一个具有 n 个顶点的有向完全图的弧 数为 n(n-1)3.无向图

爪哇国新游记之二十五----图及其遍历查找

代码: import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; // 顶点类 class Vertex{ String name;// 名称 boolean visited;// 是否已访问

2-25《啊哈算法》第5章,图的遍历原理。

第一节,深度和广度优先指啥 针对图的遍历而言的. 深度优先遍历的主要思想:沿着图的某一分支遍历直到末端,然后回朔,然后再沿着另一条进行同样的遍历,直到所有顶点都被访问过为止. 广度优先遍历的主要思想:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有顶点都被访问过,遍历结束. 原文地址:https://www.cnblogs.com/chentianwei/p/8470544.html

第五章 树和二叉树

上章回顾 单链表的基本操作,包括插入.删除以及查找 双向链表和循环链表的区别 [email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第五章 第五章 树和二叉树 树和二叉树 [email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 预习检查 什么是二叉树 树的遍历有哪几种方式 树有哪些应用 [email pr

第五章 Fork/Join框架

Java 7 并发编程实战手册目录 代码下载(https://github.com/Wang-Jun-Chao/java-concurrency) 第五章 Fork/Join框架 5.1简介 通常,使用Java来开发一个简单的并发应用程序时,会创建一些Runnable对象,然后创建对应的Thread对象来控制程序中这些线程的创建.执行以及线程的状态.自从Java 5开始引入了 Executor和ExecutorService接口以及实现这两个接口的类(比如ThreadPoolExecutor)之

第五章学习小结

---恢复内容开始--- 第五章主要学习的是树与二叉树,有利用数组进行存储的顺序二叉树,也有利用链表进行存储的链式二叉树,在这个基础上又展开了二叉树的遍历. 二叉树的遍历分为前序遍历,中序遍历以及后序遍历,主要区别在于遍历的顺序不同. 前序遍历: (1)访问根结点. (2)前序遍历左子树. (3)前序遍历右子树 . 中序遍历: (1)中序遍历左子树 (2)访问根结点 (3)中序遍历右子树 后序遍历: 1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点 对于二叉树树的遍历的应用: 给定两棵

第五章 电子星球

                   第五章         电子星球   山高高兮.路长长,岁月悠悠兮.转眼空.   镇楼竹: 1. 秀竹一枝自宛然, 莫愁风雨损华年. 几番颠扑呈贞骨, 露重霜寒节更坚. 2. 纤纤凤竹长漓边, 不共山花斗野妍. 时对清流摇倩影, 溪流常伴乐怡然. 3. 坚节何愁风雨多, 晴天朗日更婆娑. 生凉不荫趋炎客, 惹得骚人为咏歌.   咏经典物理.戏现代理论物理: 在山泉水洁如冰, 溅玉飞珠迸有声. 流入大江清浊混, 滔滔何日见澄明.     一.   批驳现代理论

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

JS复习第五章

第五章 引用类型 一.Object类型 创建object实例的方式有两种. 第一种是使用new操作符后跟object构造函数,如下所示: ver person = new Object( ) ; person.name = “Nicholas” ; person.age = 29 ; 另一种方式是使用对象字面量表示法: var person = { name : “Nicholas”, age : 29 } ; 对象字面量是向函数传递大量可选参数的首选形式. function displayIn