无向图邻接表(深度优先算法)

简介: 无向图邻接表(深度优先算法)
#include <iostream>
using namespace std;
#define MaxVertexNum 100// 最大顶点数为100
#define VertexType char//顶点域为字符型
int visited[MaxVertexNum];//标记结点是否被访问过
typedef struct enode//边表中的结点
{
  int adjvex;//边表顶点域
  struct enode* next;//指针域
}EdgeNode;
typedef   struct vnode//顶点表
{
  VertexType vertex;//顶点域
  EdgeNode* firstedge;//边表头指针
}VertexNode;
typedef struct//邻接表
{
  VertexNode vexs[MaxVertexNum];//节点表
  int n, e;//顶点数和边数
}ALGraph;
void InsertNode(ALGraph& G, int i, int j)//在边表中插入结点
{
  EdgeNode* s;
  s = (EdgeNode*)malloc(sizeof(EdgeNode));//生成新边表结点s
  s->adjvex = j;//邻接点序号为j 
  s->next = G.vexs[i].firstedge;
  G.vexs[i].firstedge = s;//将新边表结点s插入到顶点Vi的边表头部
}
ALGraph CreateALGraph()//建立邻边表
{
  ALGraph G;
  int i, j;
  cout << "请输入顶点数和边数:\n";
  cin >> G.n >> G.e;
  cout << "请输入顶点信息:\n";
  for (i = 0; i < G.n; i++)//建立有n个顶点的顶点表
  {
    cin >> G.vexs[i].vertex;//输入顶点
    G.vexs[i].firstedge = NULL;//顶点的边表头指针设为空
  }
  cout << "请输入边的信息(输入格式为:i (空格) j ):\n";
  for (int k = 0; k < G.e; k++)//建立邻接表
  {
    cin >> i >> j;
    InsertNode(G, i, j);
    InsertNode(G, j, i);
  }
  return G;
}
void DFSAL(ALGraph G, int i) //以Vi为出发点对图G搜索
{
  EdgeNode* p;
  cout << G.vexs[i].vertex << "  ";//访问顶点Vi
  visited[i] = 1;//标记Vi已访问
  p = G.vexs[i].firstedge;//取Vi边表的头指针
  while (p)//依次搜索Vi的邻接点Vj
  {
    if (visited[p->adjvex] == 0)//若Vj尚未访问,则以Vj为出发点继续搜索
      DFSAL(G, p->adjvex);
    p = p->next;//找Vi的下一个邻接点
  }
}
void DFSTraverseAL(ALGraph G)
{
  int  i;
  for (i = 0; i < G.n; i++)
    visited[i] = 0;//初始化
  for (i = 0; i < G.n; i++)
    if (visited[i] == 0)
      DFSAL(G, i);//Vi未访问过,从Vi开始搜索
}
int main()
{
  ALGraph G = CreateALGraph();
  cout << "该图的深度优先搜索遍历得到的顶点序列为:";
  DFSTraverseAL(G);
  system("pause");
  return 0;
}

有问题留言

相关文章
|
5月前
|
监控 算法 机器人
软件体系结构 - 调度算法(2) 最低松弛度优先
【4月更文挑战第19天】软件体系结构 - 调度算法(2) 最低松弛度优先
159 0
|
5月前
|
存储 人工智能 算法
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
340 0
|
4月前
|
算法 Python
深度优先算法
深度优先算法
|
5月前
|
监控 算法 自动驾驶
软件体系结构 - 调度算法(1) 最早截至时间优先
【4月更文挑战第19天】软件体系结构 - 调度算法(1) 最早截至时间优先
275 0
|
1月前
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
67 12
|
3月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
62 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
4月前
|
算法 Python
广度优先算法
广度优先算法
|
4月前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
12月前
|
算法 Go C++
【LeetCode 算法专题突破】二叉树的深度优先遍历(⭐)
【LeetCode 算法专题突破】二叉树的深度优先遍历(⭐)
62 0