数据结构图的邻接矩阵存储及深度广度优先搜索

2023-11-04

#include<stdio.h> 
#include<stdlib.h>
#define INFINITY INT_MAX     /* 最大值∞ */
#define MAX_VEX 20    /*  最大顶点数  */
int  Visited[MAX_VEX];/*  标志数组  */
typedef enum{DG,DN,UDG,UDN} Graphkind;
typedef struct{              //包含权的邻接矩阵的的定义
    int Vertices[MAX_VEX];             //顶点信息的数组
    int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵 
    int vexnum; //当前图的顶点数
    int arcnum; //当前的图边数
    Graphkind kind;
}MGraph;
//函数声明 
void CreateDG(MGraph *G);
void CreateDN(MGraph *G);
void CreateUDG(MGraph *G);
void CreateUDN(MGraph *G);
void DispGraph(MGraph G);
void DFS_traverse_Grapg(MGraph G);
void BFS_traverse_Grapg(MGraph G);
//构造图(选择图的种类)  
void CreateGraph(MGraph *G){
	while(1){
		printf("请输入图的种类(0.有向图 1.有向网 2.无向图 3.无向网):");
	    scanf("%d",&G->kind);
		switch(G->kind) {
		case DG:CreateDG(G);break;
		case DN:CreateDN(G);break;
		case UDG:CreateUDG(G);break;
		case UDN:CreateUDN(G);break;
		default:printf("输入错误,请从新输入!\n"); 
	    }
	    if(G->kind>=0&&G->kind<=3){
    	    DispGraph(*G);
    	    printf("\n");
    	    DFS_traverse_Grapg(*G);
    	    printf("\n");
    	    BFS_traverse_Grapg(*G);
    	    printf("\n******************************************************\n");
	    }        
	}
}
/* 构造时输入弧(边)的顺序会影响打印的邻接表及深、度广度优先搜索  */ 
//有向图 
void CreateDG(MGraph *G) //图的生成函数
{ 
    int vi,vj,w,i,j;
    printf("请输入图的顶点数和弧数(以空格分隔):");
    scanf("%d%d",&G->vexnum,&G->arcnum);
    //图(邻接矩阵)的初始化
    for(i=0;i<G->vexnum;i++) 
        for(j=0;j<G->vexnum;j++)
                G->arcs[i][j]=0;
    //将顶点存入数组中
    for(i=0;i<G->vexnum;i++) 
    { 
        printf("请输入第%d个顶点的信息(整型):",i+1);
        scanf("%d",&G->Vertices[i]);  //以0为位置起点 
    }
    printf("\n");
    //将弧存入邻接矩阵中 
    for(i=0;i<G->arcnum;i++)
    { 
        printf("请输入第%d条弧的信息i,j,w(以空格分隔):",i+1);
        scanf("%d%d%d",&vi,&vj,&w);
		//vi,vj为边或弧的顶点位置信息 
        //若为不带权值的图,则w输入1
        //若为带权值的图,则w输入对应权值
        G->arcs[vi][vj]=w;
    }
//    DispGraph(*G);
}
//有向网 
void CreateDN(MGraph *G) //图的生成函数
{ 
    int vi,vj,w,i,j;
    printf("请输入图的顶点数和弧数(以空格分隔):");
    scanf("%d%d",&G->vexnum,&G->arcnum);
    //图(邻接矩阵)的初始化
    for(i=0;i<G->vexnum;i++) 
        for(j=0;j<G->vexnum;j++)
                G->arcs[i][j]=INT_MAX;
    //将顶点存入数组中    
    for(i=0;i<G->vexnum;i++) 
    { 
        printf("请输入第%d个顶点的信息(整型):",i+1);
        scanf("%d",&G->Vertices[i]);
    }
    printf("\n");
    //将弧存入邻接矩阵中 
    for(i=0;i<G->arcnum;i++)
    { 
        printf("请输入第%d条弧的信息i,j,w(以空格分隔):",i+1);
        scanf("%d%d%d",&vi,&vj,&w); 
        //若为不带权值的图,则w输入1
        //若为带权值的图,则w输入对应权值

        G->arcs[vi][vj]=w;
    }
//    DispGraph(*G);
}

//无向图 
void CreateUDG(MGraph *G) //图的生成函数
{ 
    int vi,vj,w,i,j;
    printf("请输入图的顶点数和边数(以空格分隔):");
    scanf("%d%d",&G->vexnum,&G->arcnum);
    //图(邻接矩阵)的初始化
    for(i=0;i<G->vexnum;i++) 
        for(j=0;j<G->vexnum;j++)
                G->arcs[i][j]=0;
     //将顶点存入数组中
    for(i=0;i<G->vexnum;i++) 
    { 
        printf("请输入第%d个顶点的信息(整型):",i+1);
        scanf("%d",&G->Vertices[i]);
    }
    printf("\n");
    //将边存入邻接矩阵中 
    for(i=0;i<G->arcnum;i++)
    { 
        printf("请输入第%d条边的信息i,j,w(以空格分隔):",i+1);
        scanf("%d%d%d",&vi,&vj,&w); 
        //若为不带权值的图,则w输入1
        //若为带权值的图,则w输入对应权值

        G->arcs[vi][vj]=w;//①
        G->arcs[vj][vi]=w;//②
        //无向图具有对称性的规律,通过①②实现
        //有向图不具备此性质,所以只需要①
    }
//    DispGraph(*G);
}
//无向网 
void CreateUDN(MGraph *G) //图的生成函数
{ 
    int vi,vj,w,i,j;
    printf("请输入图的顶点数和边数(以空格分隔):");
    scanf("%d%d",&G->vexnum,&G->arcnum);
    //图(邻接矩阵)的初始化
    for(i=0;i<G->vexnum;i++) 
        for(j=0;j<G->vexnum;j++)
            G->arcs[i][j]=INT_MAX;
    //将顶点存入数组中       
    for(i=0;i<G->vexnum;i++)
    { 
        printf("请输入第%d个顶点的信息(整型):",i+1);
        scanf("%d",&G->Vertices[i]);
    }
    printf("\n");
    //将边存入邻接矩阵中 
    for(i=0;i<G->arcnum;i++)
    { 
        printf("请输入第%d条边的信息i,j,w(以空格分隔):",i+1);
        scanf("%d%d%d",&vi,&vj,&w); 
        //若为不带权值的图,则w输入1
        //若为带权值的图,则w输入对应权值

        G->arcs[vi][vj]=w;//①
        G->arcs[vj][vi]=w;//②
        //无向网具有对称性的规律,通过①②实现
        //有向网不具备此性质,所以只需要①
    }
//    DispGraph(*G);
}
//输出邻接矩阵的信息
void DispGraph(MGraph G) 
{ 
    int i,j;
    printf("\n输出顶点的信息(整型):");
    for(i=0;i<G.vexnum;i++)
        printf("%8d",G.Vertices[i]);

    printf("\n输出邻接矩阵:\n");
    printf("\t");
    for(i=0;i<G.vexnum;i++)
        printf("%8d",G.Vertices[i]);
    printf("\n"); 
    for(i=0;i<G.vexnum;i++)
    { 
        printf("\n%8d",G.Vertices[i]);
        for(j=0;j<G.vexnum;j++)
        {   
            if(G.arcs[i][j]==INFINITY){
            	printf("%8s","∞");
			}
			else{
				printf("%8d",G.arcs[i][j]);
			}
        }
        printf("\n");   
    }
}
void Visit(int v)
{
	printf("\t%d",v);
}
/*  深度优先搜索(邻接矩阵)  */
void  DFS(MGraph G , int v)
{  int i;
   Visit(v);       /*  访问顶点v  */ 
   Visited[v]=1;   //设置访问标志
   for(i=0;i<G.vexnum;i++){
   	   if((G.arcs[v][i]>=1&&G.arcs[v][i]!=INT_MAX)&&Visited[i]==0){ //G.arcs[v][i]==1只针对图,对网无效 
   	   	    DFS(G,i);
		}
   }  
}
void DFS_traverse_Grapg(MGraph G)
{  int v;
   for (v=0 ; v<G.vexnum ; v++)
       Visited[v]=0;    /*  访问标志初始化  */ 
      //p=G->AdjList[v].firstarc;
   printf("深度优先搜索遍历:");
   DFS(G , 0);
//   for (v=0 ; v<G.vexnum ; v++){
//   	   if (!Visited[v])   /*  对图的每个顶点至多调用一次DFS函数  */
//	       DFS(G , v);
//   }
}
/*  广度优先搜索(邻接矩阵)  */
void BFS_traverse_Grapg(MGraph G){
	int Queue[MAX_VEX];
	int front=0,rear=0;
	int i,k,v,w;
	for(v=0;v<G.vexnum;v++){
		Visited[v]=0;
	}
	printf("广度优先搜索遍历:");
	for(i=0;i<G.vexnum;i++){    /*  连通图仅需从一个1顶点出发即可  */
		v=G.Vertices[i];       /*  取顶点  */
		if(!Visited[v]){         /*   v尚未访问   */
			Queue[++rear]=v;     /*   v入对   */ 
		}
		while (Queue[front]!=Queue[rear]){  /*  队列非空时  */
			w=Queue[++front];    /*  出队  */
            Visited[w]=1;       /*  置访问标志  */
            Visit(w);          /*  访问队首元素  */
            for(k=0;k<G.vexnum;k++){
            	if((G.arcs[v][i]>=1&&G.arcs[v][i]!=INT_MAX)&&Visited[i]==0){  /*  当前顶点未被访问的所有邻结点入队  */
            		Queue[++rear]=k;
				}/*  end if  */
			}/*  end for  */
		}/*  end while  */
	}/*  end for  */
}

void main()
{ 
    MGraph G;
    CreateGraph(&G);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构图的邻接矩阵存储及深度广度优先搜索 的相关文章

  • 计算正多边形的面积 Gym - 101840G

    http codeforces com gym 101840 attachments 题目大意 输入n r k n代表往外扩张几次 r代表圆的内接圆半径 k代表多边形的边长 问你每次扩张多边形和内接圆的面积之和 公式 多边形的面积公式 0
  • 码分多路复用

    引子 CDMA是个很重要的通信概念 很多的大学教科书上都会提到它 甚至我们今天可能都在使用它 然而提到cdma 很少有资料提到它的思想是多么的有创意 教科书上关于cdma的章节都过于复杂 过于数学化 虽然也有一些简便的描述方式 但是却几乎没
  • kali安装DVWA

    1 我这里使用的是kali 2020 03 版的系统 默认安装了mysql 的分支版本 MariaDB apache2 php 注 MariaDB是mysql的一个分支 实接操作与mysql没有区别 kali kali whereis my
  • stm32-07-串口通信

    串口引脚对应GPIO
  • 如何使用gdb快速attach到所需进程上

    如何使用gdb快速attach到所需进程上 大家都知道 gdb的调试功能非常强大 可以attach到打开调试开关编译出来的进程上调试进程 但是在这个流程中 你首先需要ps ef grep到你那个进程 然后找到进程号 然后再使用gdb att

随机推荐

  • JDK多版本管理工具jenv

    JENV mac jdk版本管理工具 Mac 安装jenv可以使用brew brew install jenv 配置jenv zsh配置方式 echo export PATH HOME jenv bin PATH gt gt zshrc e
  • Grafana 任意文件读取漏洞复现

    一 漏洞描述 Grafana存在任意文件读取漏洞 通过默认存在的插件 可构造特殊的请求包读取服务器任意文件 二 漏洞影响 Grafana 8 x 三 漏洞复现 可以从登陆页面看到版本信息为 v8 2 4 此版本在漏洞射程范围之内 查看当前所
  • vue3 el-upload文件上传隐藏文件列表

    vue3 el upload文件上传隐藏文件列表 一般情况根据官方教程直接使用el upload上传是会显示一个列表在下面如图 但有时候需求是在导入后不显示这个列表比如 这里只有一个导入按钮 点击之后上传文件 不用显示文件列表 那废话不多说
  • C语言中的printf,sprintf和vsprintf的区别

    参考于 28条消息 printf sprintf vsprintf 区别 ZinanJau的博客 CSDN博客 test printf cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include pch h includ
  • 常用的图像增强方法

    大规模数据集是成功应用深度神经网络的前提 例如 我们可以对图像进行不同方式的裁剪 使感兴趣的物体出现在不同位置 从而减轻模型对物体出现位置的依赖性 我们也可以调整亮度 色彩等因素来降低模型对色彩的敏感度 可以说 在当年AlexNet的成功中
  • 小程序实现语音识别转文字,坑路历程

    最近为小程序增加语音识别转文字的功能 坑路不断 特此记录 微信开发者工具 开发者工具上的录音文件与移动端格式不同 暂时只可在工具上进行播放调试 无法直接播放或者在客户端上播放 debug的时候发现 工具上录音的路径是http tmp xxx
  • signature php今日头条,今日头条_signature 求解

    最近在整理爬虫项目的时候发现 我按照源码穿进去的参数有时候能返回数据 有时候不能返回数据 execjs compile js call TAC sign 6347006294 0 我这样穿的参数 返回的有时候是这样 message succ
  • React Hooks + Umi Hooks + Ant Design Pro -------- 实时请求数据,监测到数据改变就局部刷新表格

    1 前期准备 必要条件1 首先得有一个高级表格 没有自己就去官方文档找一个 必要条件2 高级表格获取数据源方式为request 必要条件3 有umi的包 能用useRequest setTimeout应该也可以但操作应该不一样 原因 我用的
  • 如何配置内核,以支持USB设备。

    文章来源 http www 360doc com content 11 0404 23 971672 107246540 shtml 我只摘抄了其中的一部分 配置USB设备 内核中配置 要 启用 Linux USB 支持 首先进入 USB
  • 算法空间复杂度详解

    如果您觉得文章不错 期待你的一键三连哦 你的鼓励是我创作的动力之源 让我们一起加油 一起奔跑 让我们顶峰相见 前言 避免在处理大规模问题时出现效率低下 耗费较多资源 所以引入了算法复杂度 算法复杂度可以来衡量算法的效率和算法的可行性 可以帮
  • 宝塔教程AI创作系统搭建详细教程

    一 前言 众所周知 宝塔Linux面板是提升运维效率的服务器管理软件 经过200多个版本的迭代 功能全 少出错且足够安全 已获得全球百万用户认可安装 优势 使用宝塔前 手工输入命令安装各类软件 操作起来费时费力并且容易出错 而且需要记住很多
  • 【ICCV2019】论文阅读FaceForensics++: Learning to Detect Manipulated Facial Images

    FaceForensics Learning to Detect Manipulated Facial Images FaceForensics 是一个面部伪造数据集 它使研究人员能够以有监督的方式训练基于深度学习的方法 数据集包含使用四种
  • linux c 读取软连接的目标文件或目标文件夹

    show code include
  • 痛失双臂者仍能透过大脑控制机械义肢

    本文转载至 http cn engadget com 2014 12 19 double amputee mind controlled robot arms ncid rss truncated 因意外截肢的身障人士应该会对此消息燃起希望
  • 在线+离线安装pytorch经历(遇到问题,解决问题)

    PyTorch 最新安装教程 2022 02 22 知乎 zhihu com https zhuanlan zhihu com p 470841101 主要是依照上文这个步骤 进行安装 但遇到了pytorch2 01安装包没法下载或者是下载
  • 深度优先搜索(二)—— n皇后问题、素数环、困难的串

    文章目录 n皇后问题 素数环 困难的串 n皇后问题 n n棋盘放n个棋子 要求每行每列每条对角线都只有一个棋子 输出可行的方案数 import java util Scanner public class lanqiao1 static i
  • kali linux扫描wifi

    转自 https www cnblogs com daoyi p Kali Linux shi yongAircrack po jiewifi mi ma wpawp html Kali Linux能做很多事 但是它主要以渗透测试及 破解w
  • 成长这事儿,不可不说-------Day36

    其实我一直都有一个观点 从我当年刚学抛物线那会就有 人生其实就是一条轨迹 无非是一些点的集合 不过有些在低谷 有些在高峰 放形象了看 有些熠熠生辉 有些暗淡的几若消逝 有些人总喜欢回头数着过往的痕迹前行 仿佛这样才能感觉到踏实 仿佛这样才真
  • 最多站长使用的DNS服务商

    最多站长使用的DNS服务商 排名 服务商中文名称 NS服务器 域名个数 服务商网站 解析时间 1 DNSPod f1g1ns1 dnspod net f1g1ns2 dnspod net
  • 数据结构图的邻接矩阵存储及深度广度优先搜索

    include