设计算法求无向图的深度优先生成树

简介: 设计算法求无向图的深度优先生成树

设计算法求无向图的深度优先生成树

借鉴代码:

/**
 *作者:某某
 *2020年11月22日,下午15:31
 */
#include <stdio.h>
#include <malloc.h>
#define    MAXV 100//最大顶点个数
int visited[MAXV];//全局数组
typedef int InfoType;
typedef struct
{
    int edges[MAXV][MAXV];//邻接矩阵
    int vexnum, arcnum;   //顶点数,弧数
} MGraph;//图的邻接矩阵类型
typedef struct ANode
{
    int adjvex;            //该弧的终点位置
    struct ANode* nextarc; //指向下一条弧的指针
    InfoType info;         //该弧的相关信息,这里用于存放权值 n
} ArcNode;//弧的结点结构类型
typedef struct Vnode
{    //int data;           //顶点信息
    ArcNode* firstarc;//指向第一条弧
} VNode;//邻接表头结点的类型
typedef struct
{
    VNode adjlist[MAXV];//邻接表
    int n, e;//图中顶点数n和边数e
} ALGraph;//图的邻接表类型
void init(MGraph& g);//初始化邻接矩阵
void MatToList(MGraph, ALGraph*&);//将邻接矩阵g转换成邻接表G
void DispAdj(ALGraph*);//输出邻接表G
void DFS(ALGraph* G, int v);//深搜
void BFS(ALGraph* G, int v);//广搜
void main()
{
    MGraph g;
    g.vexnum = 11; g.arcnum = 13;
    init(g);//初始化邻接矩阵
    ALGraph* G = (ALGraph*)malloc(sizeof(ALGraph));
    MatToList(g, G);//将邻接矩阵g转换成邻接表G
    DispAdj(G);//输出邻接表G
    for (int i = 0; i < g.vexnum; i++) visited[i] = 0;
    printf("深度优先生成树:");
    DFS(G, 3);//从顶点3开始深度搜索
    printf("\n");
}
void DFS(ALGraph* G, int v)//从顶点v开始深度搜索 
{
    visited[v] = 1;//置已访问标记
    ArcNode* p = G->adjlist[v].firstarc;//p指向顶点v的第一条弧的弧头结点
    while (p != NULL)
    {
        if (visited[p->adjvex] == 0)//若p->adjvex顶点未访问,递归访问它
        {
            printf("<%d,%d> ", v, p->adjvex);//输出生成树的一条边
            DFS(G, p->adjvex);//递归函数  
        }
        p = p->nextarc;//p指向顶点v的下一条弧的弧头结点
    }
}
void init(MGraph& g)
{
    int i, j;
    int A[MAXV][11];
    for (i = 0; i < g.vexnum; i++)
        for (j = 0; j < g.vexnum; j++)
            A[i][j] = 0;
    A[0][3] = 1; A[0][2] = 1; A[0][1] = 1;
    A[1][5] = 1; A[1][4] = 1;
    A[2][6] = 1; A[2][5] = 1; A[2][3] = 1;
    A[3][7] = 1;
    A[6][9] = 1; A[6][8] = 1; A[6][7] = 1;
    A[7][10] = 1;
    for (i = 0; i < g.vexnum; i++)
        for (j = 0; j < g.vexnum; j++)
            A[j][i] = A[i][j];//无向图双向路径对称
    for (i = 0; i < g.vexnum; i++)
        for (j = 0; j < g.vexnum; j++)
            g.edges[i][j] = A[i][j];
}
void MatToList(MGraph g, ALGraph*& G)//将邻接矩阵g转换成邻接表G
{
    int i, j;
    G = (ALGraph*)malloc(sizeof(ALGraph));
    for (i = 0; i < g.vexnum; i++)//表头节点的指针域置初值
        G->adjlist[i].firstarc = NULL;
    for (i = 0; i < g.vexnum; i++)//对于邻接矩阵中每个元素
        for (j = g.vexnum - 1; j >= 0; j--)
            if (g.edges[i][j] != 0)//邻接矩阵的当前元素不为0---顶点i到j可以走通
            {
                ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));//创建一个新的弧节点
                p->adjvex = j;//弧节点的指向的终点位置
                p->info = g.edges[i][j];//弧节点的长度
                p->nextarc = G->adjlist[i].firstarc;//将*p链到表头后
                G->adjlist[i].firstarc = p;//更新表头指针//G->adjlist[i]---表头:顶点i连通到可连通的点
            }
    G->n = g.vexnum;//邻接表G的节点数
    G->e = g.arcnum;//弧数
}
void DispAdj(ALGraph* G)//输出邻接表G
{
    printf("图G的邻接表:\n");
    for (int i = 0; i < G->n; i++)//
    {
        ArcNode* p = G->adjlist[i].firstarc;
        if (p != NULL) printf("%3d: ", i);//输出表头元素
        while (p != NULL)
        {
            printf("%3d", p->adjvex);//输出表头后链接的元素
            p = p->nextarc;
        }
        printf("\n");
    }
}


目录
相关文章
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
102 1
|
11天前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
20 2
|
5月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
47 4
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
20 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
5月前
|
存储 算法 Linux
【数据结构和算法】---二叉树(1)--树概念及结构
【数据结构和算法】---二叉树(1)--树概念及结构
50 0
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
56 2
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
24 0
|
2月前
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
85 12
|
1月前
|
存储 算法 Java
数据结构和算法--分段树
数据结构和算法--分段树
16 0