算法6.4-6.6DFS

news/2024/7/20 22:37:29 标签: 算法, 深度优先, dfs

一个不知名大学生,江湖人称菜狗
original author: Jacky Li
Email : 3435673055@qq.com

Time of completion:2024.03.27

Last edited: 2024.03.27

目录

算法6.4-6.6DFS

第1关:算法6.5采用邻接矩阵表示图的深搜

任务描述

相关知识

编程要求

输入输出说明

测试说明

代码如下:

第2关:算法6.6采用邻接表表示图的深搜

任务描述

相关知识

编程要求

输入输出说明

测试说明

代码如下:

第3关:算法6.4非连通图的深搜-邻接矩阵表示图

任务描述

相关知识

编程要求

输入输出说明

测试说明

代码如下:

作者有言

算法6.4-6.6DFS

第1关:算法6.5采用邻接矩阵表示图的深搜

任务描述

本关任务:编写一个采用邻接矩阵表示图的深搜程序。

相关知识

为了完成本关任务,你需要掌握:1.如何创建邻接矩阵2.如何对图进行深搜。

编程要求

根据提示,在右侧编辑器补充代码,输出由一个顶点出发的深搜路径,顶点之间间隔四个空格。

输入输出说明

输入说明: 第一行为顶点数n和边数e 第二行为n个顶点符号 接下来e行为e条边,每行两个字符代表无向图的一条边 最后一行仅包含一个字符,代表深搜开始顶点 输出说明: 一条路径,顶点之间相隔四个空格

测试说明

平台会对你编写的代码进行测试:

测试输入:

4 5 a b c d a b a c a d b c c d c 测试输出: c a b d

代码如下:

//算法6.5 采用邻接矩阵表示图的深度优先搜索遍历

#include <iostream>
using namespace std;

#define MVNum 100							//最大顶点数
typedef char VerTexType;					//假设顶点的数据类型为字符型 
typedef int ArcType;                 		//假设边的权值类型为整型 

//------------图的邻接矩阵------------------
typedef struct{ 
	VerTexType vexs[MVNum];            		//顶点表 
	ArcType arcs[MVNum][MVNum];      		//邻接矩阵 
	int vexnum,arcnum;                		//图的当前点数和边数 
}Graph;

bool visited[MVNum];           				//访问标志数组,其初值为"false" 
int FirstAdjVex(Graph G , int v);			//返回v的第一个邻接点
int NextAdjVex(Graph G , int v , int w);	//返回v相对于w的下一个邻接点

int LocateVex(Graph G , VerTexType v){
	//确定点v在G中的位置
	for(int i = 0; i < G.vexnum; ++i)
		if(G.vexs[i] == v)
			return i;
		return -1;
}//LocateVex

void CreateUDN(Graph &G){ 
    //采用邻接矩阵表示法,创建无向网G 
	int i , j , k;
    cin >> G.vexnum >> G.arcnum;							//输入总顶点数,总边数

    for(i = 0; i < G.vexnum; ++i){   
		cin >> G.vexs[i];                        			//依次输入点的信息 
	}	
	

    for(i = 0; i < G.vexnum; ++i)                			//初始化邻接矩阵,边的权值均置为极大值MaxInt 
		for(j = 0; j < G.vexnum; ++j)   
			G.arcs[i][j] = 0;  

	for(k = 0; k < G.arcnum;++k){							//构造邻接矩阵 
		VerTexType v1 , v2;
		cin >> v1 >> v2;									//输入一条边依附的顶点及权值
		i = LocateVex(G, v1);  j = LocateVex(G, v2);		//确定v1和v2在G中的位置,即顶点数组的下标 
		G.arcs[j][i] = G.arcs[i][j] = 1;					//置<v1, v2>的对称边<v2, v1>的权值为w 
	}//for
}//CreateUDN 

void DFS(Graph G, int v){        		
	//图G为邻接矩阵类型 
	/****************************Begin**********************/
    cout << G.vexs[v] << "    ";
    visited[v] = true;
    for(int w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w))
    if(!visited[w]) DFS(G, w);

    /****************************End************************/
}//DFS

int FirstAdjVex(Graph G , int v){
	//返回v的第一个邻接点
	/****************************Begin**********************/
    for(int i = 0; i < G.vexnum; i ++)
    {
        if(G.arcs[v][i] == 1 && visited[i] == false) return i;
        
    }
    return -1;
    /****************************End************************/
}//FirstAdjVex

int NextAdjVex(Graph G , int v , int w){
	//返回v相对于w的下一个邻接点
	/****************************Begin**********************/
    int i;
    for(i = w; i < G.vexnum; i ++)
    {
        if(G.arcs[v][i] == 1 && visited[i] == false) return i;
        
    }
    return -1;
    /****************************End************************/
}//NextAdjVex

int main(){
	
	Graph G;

	CreateUDN(G);
	VerTexType c;
	cin >> c;

	int i;
	for(i = 0 ; i < G.vexnum ; ++i){
		if(c == G.vexs[i])
			break;
	}
	DFS(G , i);

	return 0;
}//main

第2关:算法6.6采用邻接表表示图的深搜

任务描述

本关任务:编写一个采用邻接表表示图的深搜程序。

相关知识

为了完成本关任务,你需要掌握:1.如何创建邻接表 2.如何对图进行深搜。

编程要求

根据提示,在右侧编辑器补充代码,输出由一个顶点出发的深搜路径,顶点之间间隔四个空格。

输入输出说明

输入说明: 第一行为顶点数n和边数e 第二行为n个顶点符号 接下来e行为e条边,每行两个字符代表无向图的一条边 最后一行仅包含一个字符,代表深搜开始顶点 输出说明: 一条路径,顶点之间相隔四个空格

测试说明

平台会对你编写的代码进行测试:

测试输入:

4 5 a b c d a b a c a d b c c d c 测试输出: c a b d

代码如下:

//算法6.6 采用邻接表表示图的深度优先搜索遍历

#include <iostream>
using namespace std;

#define MVNum 100							//最大顶点数
typedef char VerTexType;					//假设顶点的数据类型为字符型 

//-------------图的邻接表---------------------
typedef struct ArcNode{                		//边结点 
    int adjvex;                          	//该边所指向的顶点的位置 
    struct ArcNode *nextarc;          		//指向下一条边的指针 
}ArcNode; 

typedef struct VNode{ 
    VerTexType data;                    	//顶点信息
    ArcNode *firstarc;                		//指向第一条依附该顶点的边的指针 
}VNode, AdjList[MVNum];               		//AdjList表示邻接表类型 

typedef struct{
    AdjList vertices;                 		//邻接表 
    int vexnum, arcnum;              		//图的当前顶点数和边数 
}ALGraph;

bool visited[MVNum];           				//访问标志数组,其初值为"false" 

int LocateVex(ALGraph G , VerTexType v){
	//确定点v在G中的位置
	for(int i = 0; i < G.vexnum; ++i)
		if(G.vertices[i].data == v)
			return i;
		return -1;
}//LocateVex

void CreateUDG(ALGraph &G){ 
	//采用邻接表表示法,创建无向图G
	int i , k;
	cin >> G.vexnum >> G.arcnum;				//输入总顶点数,总边数 
	for(i = 0; i < G.vexnum; ++i){          	//输入各点,构造表头结点表
		cin >> G.vertices[i].data;           	//输入顶点值 
		G.vertices[i].firstarc=NULL;			//初始化表头结点的指针域为NULL 
    }//for
	for(k = 0; k < G.arcnum;++k){        		//输入各边,构造邻接表
		VerTexType v1 , v2;
		int i , j;
		cin >> v1 >> v2;                 		//输入一条边依附的两个顶点
		i = LocateVex(G, v1);  j = LocateVex(G, v2);
		//确定v1和v2在G中位置,即顶点在G.vertices中的序号 
		
		ArcNode *p1=new ArcNode;               	//生成一个新的边结点*p1 
		p1->adjvex=j;                   		//邻接点序号为j 
		p1->nextarc= G.vertices[i].firstarc;  G.vertices[i].firstarc=p1;  
		//将新结点*p1插入顶点vi的边表头部
		
		ArcNode *p2=new ArcNode;                //生成另一个对称的新的边结点*p2 
		p2->adjvex=i;                   		//邻接点序号为i 
		p2->nextarc= G.vertices[j].firstarc;  G.vertices[j].firstarc=p2;  
		//将新结点*p2插入顶点vj的边表头部 
    }//for 
}//CreateUDG

void DFS(ALGraph G, int v){        				//图G为邻接表类型 
	/*************************Begin*****************************/
    ArcNode *p;
    cout << G.vertices[v].data << "    ";

    visited[v] = true;
    p = G.vertices[v].firstarc;

    while(p)
    {
        if(!visited[p->adjvex]) DFS(G, p->adjvex);
        p = p->nextarc;
    }

    /*************************End*******************************/
}//DFS

int main(){
	ALGraph G;
	CreateUDG(G);
	VerTexType c;
	cin >> c;
	
	int i;
	for(i = 0 ; i < G.vexnum ; ++i){
		if(c == G.vertices[i].data)
			break;
	}
	
	DFS(G , i);
	return 0;
}//main

第3关:算法6.4非连通图的深搜-邻接矩阵表示图

任务描述

本关任务:编写一个采用邻接表表示图的深搜程序。

相关知识

为了完成本关任务,你需要掌握:1.如何创建邻接表 2.如何对图进行深搜。

编程要求

根据提示,在右侧编辑器补充代码,输出由一个顶点出发的深搜路径,顶点之间间隔四个空格。

输入输出说明

输入说明: 第一行为顶点数n和边数e 第二行为n个顶点符号 接下来e行为e条边,每行两个字符代表无向图的一条边 最后一行仅包含一个字符,代表深搜开始顶点 输出说明: 一条路径,顶点之间相隔四个空格

测试说明

平台会对你编写的代码进行测试:

测试输入:

6 6 a b c d e f a b a c a d c d b d e f

测试输出: a b d c e f

代码如下:

//算法6.4 深度优先搜索遍历非连通图

#include <iostream>
using namespace std;

#define MVNum 100								//最大顶点数
typedef char VerTexType;						//假设顶点的数据类型为字符型 
typedef int ArcType;                 			//假设边的权值类型为整型 
	
//-------------图的邻接矩阵-----------------
typedef struct{ 
	VerTexType vexs[MVNum];            			//顶点表 
	ArcType arcs[MVNum][MVNum];      			//邻接矩阵 
	int vexnum,arcnum;                			//图的当前点数和边数 
}Graph;

bool visited[MVNum];           					//访问标志数组,其初值为"false" 
int FirstAdjVex(Graph G , int v);				//返回v的第一个邻接点
int NextAdjVex(Graph G , int v , int w);		//返回v相对于w的下一个邻接点

int LocateVex(Graph G , VerTexType v){
	//确定点v在G中的位置
	for(int i = 0; i < G.vexnum; ++i)
		if(G.vexs[i] == v)
			return i;
		return -1;
}//LocateVex

void CreateUDN(Graph &G){ 
    //采用邻接矩阵表示法,创建无向网G 
	int i , j , k;
    cin >> G.vexnum >> G.arcnum;								//输入总顶点数,总边数
	for(i = 0; i < G.vexnum; ++i){   
		cin >> G.vexs[i];                        				//依次输入点的信息 
	}

    for(i = 0; i < G.vexnum; ++i)                				//初始化邻接矩阵,边的权值均置为极大值MaxInt 
		for(j = 0; j < G.vexnum; ++j)   
			G.arcs[i][j] = 0;  

	for(k = 0; k < G.arcnum;++k){								//构造邻接矩阵 
		VerTexType v1 , v2;
		cin >> v1 >> v2;										//输入一条边依附的顶点及权值
		i = LocateVex(G, v1);  j = LocateVex(G, v2);			//确定v1和v2在G中的位置,即顶点数组的下标 
		G.arcs[j][i] = G.arcs[i][j] = 1;						//置<v1, v2>的对称边<v2, v1>的权值为w 
	}//for
}//CreateUDN 

void DFS(Graph G, int v){        								
	//从第v个顶点出发递归地深度优先遍历图G 
	/**************************Begin*************************/
    cout << G.vexs[v];

    visited[v] = true;
    for(int w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w))
    {
        if(!visited[w])
        {
            cout << "    ";
            DFS(G, w);
        }
    }

    /**************************End****************************/
}//DFS

void DFSTraverse(Graph G){ 
	//对非连通图G做深度优先遍历 
	/**************************Begin*************************/
    for(int v = 0; v < G.vexnum; v ++) visited[v] = false;
    for(int v = 0; v < G.vexnum; v ++)
    {
        if(!visited[v])
        {
            cout << endl;
            DFS(G, v);
        }
    }

    /**************************End****************************/
}//DFSTraverse 

int FirstAdjVex(Graph G , int v){
	//返回v的第一个邻接点
	int i;
	for(i = 0 ; i < G.vexnum ; ++i){
		if(G.arcs[v][i] == 1 && visited[i] == false)
			return i;
	}
	return -1;
}//FirstAdjVex

int NextAdjVex(Graph G , int v , int w){
	//返回v相对于w的下一个邻接点
	int i;
	for(i = w ; i < G.vexnum ; ++i){
		if(G.arcs[v][i] == 1 && visited[i] == false)
			return i;
	}
	return -1;
}//NextAdjVex

int main(){

	Graph G;

	CreateUDN(G);
	DFSTraverse(G);

	return 0;
}//main

作者有言

如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……


http://www.niftyadmin.cn/n/5455702.html

相关文章

SpringBoot项目使用SpringSecurity和JWT实现登录功能

使用SpringSecurity,Redis实现登录功能 首先&#xff0c;思路如下&#xff1a; 登录 ①自定义登录接口 调用ProviderManager的方法进行认证 如果认证通过生成jwt 把用户信息存入redis中 ②自定义UserDetailsService 在这个实现类中去查询数据库 注意配置passwordEncoder为BCry…

MySql实战--事务到底是隔离的还是不隔离的

第3篇文章和你讲事务隔离级别的时候提到过&#xff0c;如果是可重复读隔离级别&#xff0c;事务T启动的时候会创建一个视图read-view&#xff0c;之后事务T执行期间&#xff0c;即使有其他事务修改了数据&#xff0c;事务T看到的仍然跟在启动时看到的一样。也就是说&#xff0c…

go和Java该如何选择?

今天&#xff0c;每个企业都需要一个软件应用程序&#xff0c;从初创公司到大型公司如果你想以最有效的方式运行业务&#xff0c;你必须把它列在网上。竞争并没有就此结束 但重要的是您能够以多简单、多快速的方式创建软件应用程序-这是引领竞争的正确方式。 选择最适合您的软…

python面试题(1~10)

1、列表&#xff08;list&#xff09;和元组&#xff08;tuple&#xff09;有什么区别&#xff1f; ①列表是不可变的&#xff0c;创建后可以对其进行修改。元组是不可变的&#xff0c;元组一旦创建&#xff0c;就不能对其进行修改。 ②列表表示的顺序&#xff0c;它们是有序…

Node.js【入门级】

node 可以脱离浏览器来执行js代码,没有DOM和BOM对象,针对后端可以编写接口&#xff0c;提供网页资源&#xff0c;前端可以集成各种工具&#xff08;承上启下&#xff09;Buffer Buffer相关操作 let buf Buffer.alloc(10) console.log(buf); let buf_2 Buffer.allocUnsafe(10…

SpringBoot动态数据源实现

一、背景 一个应用难免需要连接多个数据库&#xff0c;像我们系统起码连接了5个以上数据库&#xff0c;AWS RDS主库&#xff0c;ECS自搭MySQL从库&#xff0c;工厂系统三个SQLServer数据库&#xff0c;在线网站MySQL数据库&#xff0c;记得很早以前是用SessionFactory配置&…

vue3+ts白屏问题解决

文章目录 打开白屏解决方法可能出现问题使用base导致的使用baseUrl导致的 注意点vue3ts白屏问题知识分享 打开白屏 解决方法 在vue.config.js页面 添加publicPath:./, const { defineConfig } require(vue/cli-service)module.exports defineConfig({ transpileDependenci…

Python学习之-顺序结构-入求多边形面积

第1关&#xff1a;顺序结构-无输入求多边形的面积 任务描述 本关任务&#xff1a;计算一个由正方形和等腰三角形组成的多边形的面积&#xff0c;其中正方形边长 4 厘米&#xff0c;等腰三角形底边为正方形的一条边&#xff0c;其到对角顶点的高为 2.6 厘米。 编程要求 仔细阅读…