图的深度优先搜索与广度优先搜索

本文介绍了图的深度优先搜索(DFS)和广度优先搜索(BFS)的基本概念,强调了这两种搜索方法在图论和其他领域的广泛应用。通过邻接表和邻接矩阵两种存储结构,展示了DFS和BFS的代码实现,并通过实例演示了搜索过程,包括无向图和有向图的情况。
摘要由CSDN通过智能技术生成

DFS(深度优先搜索)和BFS(广度优先搜索)是两种最基本的搜索方法,不仅是在图论中在其他很多方面都有应用,也就是说,dfs和bfs是ACM的基础,要熟练掌握他们就要深刻理解它们的搜索原理。那么图的深搜和广搜也是图论的基础,许多知识点都会应用到搜索,比如拓扑排序,深搜和广搜的定义就不说了,下面是图的dfs和bfs搜索代码:

下面采用邻接表存储结构实现:

//图的深度优先搜索
//邻接表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stack>
#define Max 100 //顶点个数最多为100个
using namespace std;
typedef char type;
typedef struct Arcnode{
	int index;
	int value;
	struct Arcnode *next;
}Arcnode,*parc;
typedef struct Node{
	type data;
    Arcnode *first;
}Node;
typedef struct Grap{
	Node nodetex[Max];
	int n; //顶点数
	int m; //边数
}Grap,*pgrap;
bool visit[Max];
int Located(pgrap g,char ch){
	for(int i=0;i<g->n;i++)
		if(ch==g->nodetex[i].data)
			return i;
}
void Creat_grap(pgrap g){
	printf("输入图的结点数和边数:\n");
	scanf("%d%d",&g->n,&g->m);
	getchar();
	int i,index1,index2,value;
	char ch1,ch2;
	printf("输入各顶点:\n");
	for(i=0;i<g->n;i++){
	g->nodetex[i].data=getchar();
	g->nodetex[i].first=NULL;
	getchar();
	}
	printf("输入各边及权值:\n");	
	parc q;
	for(i=0;i<g->m;i++){
		scanf("%c,%c,%d",&ch1,&ch2,&value);
		getchar();
		index1=Located(g,ch1);
		index2=Located(g,ch2);
		q=(parc)malloc(sizeof(Arcnode));
		q->index=index2;
		q->value=value;
		q->next=g->nodetex[index1].first;
		g->nodetex[index1].first=q;
		//无向图(默认为任意两个顶点之间之多有一条边且自身到自身无边)
		q=(parc)malloc(sizeof(Arcnode));
		q->index=index1;
		q->value=value;
		q->next=g->nodetex[index2].first;
		g->nodetex[index2].first=q;
	}
}
void Delete_grap(pgrap g){
	parc p,q;
	for(int i=0;i<g->n;i++){
		p=g->nodetex[i].first;
		while(p){
			q=p->next;
			free(p);
			p=q;
		}
	}
}
//递归算法
/*void dfs(pgrap g,int v){
	printf("访问结点: ");
	putchar(g->nodetex[v].data);
	visit[v]=1;
	parc p=g->nodetex[v].first;
	while(p){
		if(!visit[p->index])
			dfs(g,p->index);
		p=p->next;
	}
}*/
//非递归算法
void dfs(pgrap g,int v){
	stack<int> s;
	s.push(v);
	int index;
	while(!s.empty()){
		ind
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值