邻接矩阵创建图,深度优先搜索

#include "stdio.h"
#include "stdlib.h"   

#define TRUE 1
#define FALSE 0

typedef int Boolean;

typedef char VertexType;
typedef int EdgeType; 

#define MAXSIZE 9
#define MAXEDGE 15
#define MAXVEX 9
#define INFINITY 65535

typedef struct
{
    VertexType vexs[MAXVEX];
    EdgeType arc[MAXVEX][MAXVEX];
    int numVertexes, numEdges;
}MGraph;

void CreateMGraph(MGraph *G)
{
    int i,j,k,w;
    printf("输入顶点数和边数:\n");
    scanf("%d %d",&G->numVertexes,&G->numEdges);
    getchar();
    for(i = 0;i <G->numVertexes;i++) {
        scanf("%c",&G->vexs[i]);
        getchar();
    }
    for(i = 0;i <G->numVertexes;i++)
        for(j = 0;j <G->numVertexes;j++)
            G->arc[i][j]=INFINITY;
    for(k = 0;k <G->numEdges;k++)
    {
        printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
        scanf("%d %d %d",&i,&j,&w);
        G->arc[i][j]=w;
        G->arc[j][i]= G->arc[i][j];
    }
}

Boolean visited[MAXVEX]; 

void DFS(MGraph G, int i)
{
    int j;
     visited[i] = TRUE;
     printf("%c ", G.vexs[i]);
    for(j = 0; j < G.numVertexes; j++)
        if(G.arc[i][j] == 1 && !visited[j])
             DFS(G, j);
}

void DFSTraverse(MGraph G)
{
    int i;
     for(i = 0; i < G.numVertexes; i++)
         visited[i] = FALSE;
    for(i = 0; i < G.numVertexes; i++)
         if(!visited[i])
            DFS(G, i);
}

int main(void)
{
    MGraph G;
    CreateMGraph(&G);
    printf("\n深度遍历:");
    DFSTraverse(G);
    return 0;
}
时间: 2024-10-03 07:30:16

邻接矩阵创建图,深度优先搜索的相关文章

采用邻接矩阵创建图

采用邻接矩阵创建一个有向网N 分析:图的创建主要利用输入的各个顶点,并存储到一个向量(一维数组)中,然后通过输入两个顶点及权重创建弧,利用二维数组表示,因此,利用邻接矩阵创建图的存储需要两个数组:一个一维数组和一个二维数组. #include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> typedef char VertexType[4]; typedef char In

图 - 深度优先遍历

图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traverse Graph). 图的遍历方法一般有两种,第一种是深度优先遍历(Depth First Search),也有称为深度优先搜索,简称为DFS.第二种是<广度优先遍历(Breadth  First Search)>,也有称为广度优先搜索,简称为BFS.我们在<堆栈与深度优先搜索>中已经较为详细地讲述了深度优先搜索的策略,这里不再赘述.我们也可以把图当作

深度优先搜索 &amp;&amp; 广度优先搜索

类比二叉树先序遍历与图深度优先搜索 在引入图的深度优先搜索之前,为了更加容易理解.先考究一种特殊的图---二叉树的深度优先搜索算法---即二叉树的递归遍历方法. 二叉树的前序遍历算法: void TreeWalk(node* root) { if(root) { visit(root); TreeWalk(root->left); TreeWalk(root->right); } } 对于二叉树来说,步骤如下: 1.如果root不为空,先访问root, 2再递归下降地访问root->le

Java用邻接矩阵实现图并进行深度优先搜索

先定义节点类 class Vertex{ char label; boolean wasVisited; public Vertex(char label){ this.label = label; wasVisited = false; } } 图: class Graph{ private final int MAX_VERTS = 20; private Vertex vertexList[];//节点列表 private int adjMat[][];//邻接矩阵 private int

图的遍历之深度优先搜索和广度优先搜索

转自:http://www.cnblogs.com/skywang12345/ 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到. 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访

图的遍历之深度优先搜索(DFS)

深度优先搜索(depth-first search)是对先序遍历(preorder traversal)的推广.”深度优先搜索“,顾名思义就是尽可能深的搜索一个图.想象你是身处一个迷宫的入口,迷宫中的路每一个拐点有一盏灯是亮着的,你的任务是将所有灯熄灭,按照DFS的做法如下: 1. 熄灭你当前所在的拐点的灯 2. 任选一条路向前(深处)走,每经过一个拐点将灯熄灭直到与之相邻的拐点的灯全部熄灭后,原路返回到某个拐点的相邻拐点灯是亮着的,走到灯亮的拐点,重复执行步骤1 3. 当所有灯熄灭时,结束 将

图的遍历之 深度优先搜索和广度优先搜索

本章会先对图的深度优先搜索和广度优先搜索进行介绍,然后再给出C/C++/Java的实现. 目录 1. 深度优先搜索的图文介绍 1.1 深度优先搜索介绍 1.2 深度优先搜索图解 2. 广度优先搜索的图文介绍 2.1 广度优先搜索介绍 2.2 广度优先搜索图解 3. 搜索算法的源码 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然

图的邻接表法深度优先搜索

# include <stdio.h> # include <stdlib.h> # define True 1 # define False 0 # define Error -1 # define OK 1 # define MAX_VERTEX_NUM 20 int visited[MAX_VERTEX_NUM];                       //定义标志数组 typedef char VertexData; typedef enum{DG,DN,UDG,UD

图的深度优先搜索 递归和非递归实现 c++版本

本文参考了李春葆版本的数据结构上机指导,但是原版是c代码, 本文用了c++实现,并且修复了深度优先搜索非递归的一个bug. graph.cpp文件: #include "graph.h" #include <queue> #include <stack> int visited[MAXV ]; MGraph ::MGraph(int A[100][10], int nn , int ee) { e= ee ; n= nn ; for (int i=0;i<