图的邻接矩阵表示法以及深度优先搜素

1 顶点A的未访邻接点有B、D、E,首先访问A的第一个未访邻接点B;
2 顶点B的未访邻接点有C、D,首先访问B的第一个未访邻接点C;
3 顶点C的未访邻接点只有F,访问F;
4 顶点F没有未访邻接点,回溯到C;
5 顶点C已没有未访邻接点,回溯到B;
6 顶点B的未访邻接点只剩下D,访问D;
7 顶点D的未访邻接点只剩下G,访问G;
8 顶点G的未访邻接点有E、H,首先访问G的第一个未访邻接点E;
9 顶点E没有未访邻接点,回溯到G;
10 顶点G的未访邻接点只剩下H,访问H;
11 顶点H的未访邻接点只有I,访问I;
12 顶点I没有未访邻接点,回溯到H;
13 B顶点H已没有未访邻接点,回溯到G;
14 顶点G已没有未访邻接点,回溯到D;
15 顶点D已没有未访邻接点,回溯到B;
16 顶点B已没有未访邻接点,回溯到A。

 

#include<stdio.h>
#include<stdlib.h>
#define True 1
#define False 0
#define MAX 20 //顶点个数
int visited[MAX];
/*图的种类:DG表示有向图,DN表示有向网,UDG表示无向图,UDN表示无向网*/
//邻接矩阵图,深度优先遍历
typedef enum{DG,DN,UDG,UDN} GraphKind;
typedef enum{DQ,WQ} AdjType;
typedef struct{  //定义弧
    int info;   //权值
}ArcNode;
typedef struct{  //定义图
    char vertex[MAX]; //图的顶点
    ArcNode arcs[MAX][MAX]; //邻接矩阵
    int vexnum,arcnum;   //图的顶点数和弧数
    GraphKind kind;    //图的类型
}AdjMatrix;

int GreateDN(AdjMatrix *G)  //建立图
{
    int i,j,k,weight;   //i用于一维数组和矩阵,j用于矩阵,k:第几条弧
    char v1,v2;    //图的顶点
    printf("输入图的顶点数和弧数:");
    scanf("%d,%d",&(G->vexnum),&(G->arcnum)); 
    printf("输入图的顶点:(A,B,C...)");
    for(i=0;i<G->vexnum;i++)
        {
          getchar();
          scanf("%c",&(G->vertex[i])); 
        } 
    for(i=0;i<G->vexnum;i++)  //初始化邻接矩阵
        for(j=0;j<G->vexnum;j++)  
            G->arcs[i][j].info=0;   
    for(k=0;k<G->arcnum;k++)  
        { 
          getchar();
          printf("请输入第%d条弧的两个顶点名称:",k+1);  
          scanf("%c,%c",&v1,&v2); 
          
         for(i=0;v1!=G->vertex[i];i++)  
           for(j=0;v2!=G->vertex[j];j++);
	         G->arcs[j][i].info=1;
          G->arcs[i][j].info=1;  
         }  
}  
 
void Depthsearch(AdjMatrix *G)   //深度优先遍历搜索
{  
    int i;  
    for(i=0;i<G->vexnum;i++)  //初始化所有顶点为False,未访问
        visited[i]=False;     
    for(i=0;i<G->vexnum;i++)  
        if(!visited[i])   
            Depth(G,i); 
}
void Depth(AdjMatrix *G,int i)  //深度优先遍历
{  
    int j;  
    printf("%c ",G->vertex[i]);   //访问vi顶点 
    visited[i]=True;          
    for(j=0;j<G->vexnum;j++)           //依次搜索vi邻接点  
        if(G->arcs[i][j].info==1 && !visited[j])  
            Depth(G,j);  
}  
 
int main() 
{ 
    AdjMatrix G; //G的邻接矩阵表示法
    GreateDN(&G); //创建G的邻接矩阵
    printf("邻接矩阵的深度优先遍历输出结果:"); 
    Depthsearch(&G); 
    printf("\n");
    printf("邻接矩阵的广度优先遍历输出结果:"); 
    Breadthsearch(&G);
    return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cherry_希.

附gitee源码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值