图的邻接矩阵与搜索

news/2024/7/20 20:13:57 标签: 深度优先, 算法, 数据结构, 开发语言

问题描述 

【问题描述】

给定一个无向图,创建图的邻接矩阵表示,并对无向图进行深度和广度遍历。

【输入形式】

输入图的顶点序列(以#结束)和图的边(以输入-1,-1作为结束)。

ABCDEFGH#

0,1

0,2

0,5

1,3

1,4

2,5

2,6

3,7

4,7

-1,-1

输入遍历的起始顶点序号,如输入2(表示从顶点C出发遍历)。

【输出形式】

输出图的邻接矩阵表示;(邻接矩阵的每个元素之间以空格分隔)

输出从起始顶点出发的深度和广度遍历序列。

【样例输入】

ABCDEFGH#

0,1

0,2

0,5

1,3

1,4

2,5

2,6

3,7

4,7

-1,-1

2

【样例输出】

graph:

0 1 1 0 0 1 0 0

1 0 0 1 1 0 0 0

1 0 0 0 0 1 1 0

0 1 0 0 0 0 0 1

0 1 0 0 0 0 0 1

1 0 1 0 0 0 0 0

0 0 1 0 0 0 0 0

0 0 0 1 1 0 0 0

dfs:CABDHEFG

bfs:CAFGBDEH

程序设计 

#include<stdio.h>
#include<stdlib.h>

#define N 20
#define M 20
#define MAX 100

typedef char VexType;
typedef int ElemType;

typedef struct
{
    int vexnum,arcnum;
    VexType vexs[N];
    int arcs[N][N];
}MGraph;

typedef struct
{
    ElemType data[MAX];
    int front;
    int rear;
}SqQueue;


void createMGraph(MGraph *g)
{
    int i=0,j;
    g->vexnum=0;
    g->arcnum=0;
    scanf("%c",&g->vexs[i]);
    while(g->vexs[i]!='#')
    {
        i++;
        scanf("%c",&g->vexs[i]);
        g->vexnum++;
    }
    
    
    for(i=0;i<g->vexnum;i++)
       for(j=0;j<g->vexnum;j++)
          g->arcs[i][j]=0;
    
    scanf("%d,%d",&i,&j);
    while(i!=-1&&j!=-1)
    {
        g->arcs[i][j]=1;
        g->arcs[j][i]=1;
        g->arcnum++;
        scanf("%d,%d",&i,&j);
    }
    printf("graph:\n");
    for(i=0;i<g->vexnum;i++)
    {
        for(j=0;j<g->vexnum;j++)
        {
            printf("%d ",g->arcs[i][j]);
        }
        printf("\n");
    }
}


int visited1[N];
int visited2[M];

void DFS(int i,MGraph *g)
{
    int j;
    printf("%c",g->vexs[i]);
    visited1[i]=1;
    for(j=0;j<g->vexnum;j++)
        if((g->arcs[i][j]==1)&&(!visited1[j]))
            DFS(j,g);
}

void BFS(int k, MGraph *g)
{
int i,j;
    SqQueue qlist,*q;
    q=&qlist;
    q->rear=0;
    q->front=0;
    printf("%c",g->vexs[k]);
    visited2[k]=1;
    q->data[q->rear]=k;
    q->rear=(q->rear+1)%MAX;
    while(q->rear!=q->front)
    {
        i=q->data[q->front];
        q->front=(q->front+1)%MAX;
        for(j=0;j<g->vexnum;j++)
            if((g->arcs[i][j]==1)&&(!visited2[j]))
        {
            printf("%c",g->vexs[j]);
            visited2[j]=1;
            q->data[q->rear]=j;
            q->rear=(q->rear+1)%MAX;
        }
    }
}


int main()
{
    int x;
    MGraph p;
    createMGraph(&p);
    scanf("%d",&x);
    printf("dfs:");
    DFS(x,&p);
    printf("\n");
    printf("bfs:");
    BFS(x,&p);
    return 0;


http://www.niftyadmin.cn/n/10782.html

相关文章

云原生之Docker的容器资源管理

云原生之Docker的容器资源管理 一、检查本地docker环境1.检查系统版本2.检查Docker状态二、Cgroup和NameSpace介绍1.Cgroup简介2.NameSpace简介3.容器的资源隔离三、容器的资源限额1.容器中CPU的使用限额①运行一个压力测试容器②新开启终端top查看资源使用情况2.测试cpu权重限…

数据上云,如何解除用户对厂商监守自盗的担忧?

企业数字化转型中&#xff0c;安全从来都是企业用户最为关心和敏感的问题之一。对于数据上云&#xff0c;很多企业持保留态度。作为数字化转型服务商&#xff0c;如何解除用户对厂商监守自盗的担忧&#xff1f; 1.敏感的数据安全与用户的普遍认识 企业用户普遍对数据安全是极其…

【刷题】leetcode349-两个数组的交集

【题目描述】&#xff1a;给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a…

磁盘怎么删除分区,磁盘管理怎么删除分区

为了高效地利用磁盘分区&#xff0c;会删除部分磁盘分区&#xff0c;但是很多的用户都不知道应该怎么删除磁盘分区&#xff0c;所以&#xff0c;易我小编将讲解磁盘怎么删除分区。 一、为什么要删除磁盘分区 因为不同用户的磁盘分区管理需求不同&#xff0c;为了适应用户的具体…

基于matlab的排队系统仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 排队系统是基本的离散事件系统&#xff0c;了解掌握离散事件系统是研究排队系统仿真不可或缺的前提。离散事件系统是指其状态变量只在某些离散时…

Colmap 实用教程 —— Command-line Interface

https://colmap.github.io/index.html Windows 通过 COLMAP.bat&#xff0c;Linux 通过 colmap 使用命令行调用 Colmap 工具。 Structure-from-Motion 简要介绍 从大范围来看的话&#xff0c;整个流程可以分成以下三个阶段&#xff1a; Feature detection and extractionFe…

力扣刷题(刷满1000题)

1.给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 示例 1&#xff1a; 输入&#xff1a;nums [2,7,11,15], target 9 输出&#xff1a;[0,1] 解释&#xff1a;因为 nu…

一条SQL语句执行的顺序

1. 查询语句 1.1 总体流程 大体来说&#xff0c;MySQL可以分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖MySQL的大多数核心服务 功能&#xff0c;以及所有的内置函数(如日期、时间、数学和加密函数等)&#xff0…