IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构--图的深度和广度优先遍历 -> 正文阅读

[数据结构与算法]数据结构--图的深度和广度优先遍历

本篇文章记录数据结构实验内容-----无向图的深度和广度优先遍历。

代码:

#include<bits/stdc++.h> 
using namespace std;

#define mvnum 100
#define maxsize 100 
//#define OVERFLOW -1
#define ERROR 0
#define OK 1
typedef char VerTexType;
typedef int ArcType;
typedef int status;
typedef int Eelemtype;

typedef struct
{
	Eelemtype *base;
	int front;
	int rear;
}Squeue;//定义队列 

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

Squeue q;
status initqueue(Squeue &q)//初始化队列 
{
	q.base=new Eelemtype[maxsize];
	if(!q.base) exit(-1);
	q.front=q.rear=0;
	return OK;
}

status push(Squeue &q,Eelemtype e)//进队操作 
{
	if((q.rear+1)%maxsize==q.front)
	   return ERROR;
	q.base[q.rear]=e;
	q.rear=(q.rear+1)%maxsize;
	return OK;
} 

status pop(Squeue &q,Eelemtype e)//出队操作 
{
	if(q.front==q.rear) return ERROR;
	e=q.base[q.front];
	q.front=(q.front+1)%maxsize;
	return OK;
}

status empty(Squeue &q)//判断队列是否为空 
{
	if(q.front!=q.rear)
	   return 1;
	else return 0;
}

Eelemtype gethead(Squeue q)//取出队列的队首元素值 
{
	if(q.front!=q.rear)
	   return q.base[q.front];
}



int locate(AMGraph &G,int v)//在建立无向图的时候用于求下标 
{
	for(int i=0;i<G.vexnum;i++)//在所有点中寻找 
	{
		if(i==v)//与所求的下标相等则直接返回 
		  return i;
	}
}

int v1,v2,w;
void createudn(AMGraph &G)//创建无向图 
{
	cout<<"请输入无向图的点数和边数"<<endl; 
	cin>>G.vexnum>>G.arcnum;
	cout<<"请输入各顶点"<<endl; 
	for(int i=0;i<G.vexnum;i++)
	    cin>>G.vexs[i];//在顶点数组中输入顶点 
	for(int i=0;i<G.vexnum;i++)
	  for(int j=0;j<G.vexnum;j++)
	  {
	  	G.arcs[i][j]=0;//无向图是将每个边赋值为0 
	  }
	cout<<"请输入无向图邻接结点"<<endl; 
	for(int k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2; 
		int i=locate(G,v1);int j=locate(G,v2);//求出顶点v1和v2的下标 
		G.arcs[i][j]=1;//利用求出的下标赋权值 
		G.arcs[j][i]=G.arcs[i][j];//针对无向图的语句 
	}
}

bool visited[100];//辅助标记数组 
void dfs(AMGraph G,int v)//深度优先遍历 
{
	cout<<G.vexs[v]<<" ";
	visited[v]=1;
	for(int j=0;j<G.vexnum;j++)
	{
		if(G.arcs[v][j]&&!visited[j])
		  dfs(G,j);
	}
}

void dfstravel(AMGraph G)//对所有的连通分量进行遍历 
{
	for(int v=0;v<G.vexnum;v++)
	   visited[v]=0;//辅助标记数组初始化全为0 
	for(int v=0;v<G.vexnum;v++)
	   if(!visited[v]) dfs(G,v);
}

void bfstravel(AMGraph G)//广度优先遍历无向图 
{
	for(int v=0;v<G.vexnum;v++)
	    visited[v]=0;
	for(int v=0;v<G.vexnum;v++)//对所有联通分量进行操作 
	{
		if(!visited[v])
		{
			cout<<G.vexs[v]<<" ";
			visited[v]=1; 
			push(q,v);//进队 
			while(empty(q)==1)//队列非空时 
			{
				Eelemtype t=gethead(q);//取出队首元素 
			//	cout<<t<<" "; 
				pop(q,t);//队首元素出队 
				for(int j=0;j<G.vexnum;j++)
				{
					if(G.arcs[t][j]==1&&!visited[j])
					{
						cout<<G.vexs[j]<<" ";
						visited[j]=1;
						push(q,j);
					}
				}
			}
		} 
	}
	
}

int main()
{
	int ch;
	AMGraph G;
	initqueue(q);
	cout<<"请输入你要选择的操作:"<<endl;
	cout<<"1.创建无向图"<<endl;
	cout<<"2.输出图的深度优先遍历结果"<<endl;
	cout<<"3.输出图的广度优先遍历结果"<<endl; 
	cin>>ch;
	while(ch!=4)
	{
		switch(ch)
		{
			case 1:createudn(G);
			       cout<<"无向图创建成功!";
			       cout<<endl;
				   break;
			case 2:cout<<"无向图的深度优先遍历结果为:"<<endl; 
			       dfstravel(G);
			       cout<<endl; 
			       break;
			case 3:cout<<"无向图的广度优先遍历结果为:"<<endl; 
			       bfstravel(G);
			       cout<<endl;
			       break;
		}
		cin>>ch; 
	} 
	return 0;
}

例子:

输入:

6 5
0 1 2 3 4 5
0 1
1 2
1 3
0 4
4 5

?输出显示:

完结!?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:21:18  更:2022-04-29 12:23:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 2:24:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码