BFS广度优先
创始人
2024-01-31 01:24:45
0

题目描述如下:
使用邻接矩阵实现BFS:

请添加图片描述

输入
8,10
1
2
3
4
5
6
7
8
1,2
1,5
2,6
3,6
3,4
3,7
4,7
4,8
6,7
7,8
2
输出
请输入顶点数和边数:请输入顶点本身的数据:
请输入边的数据:
0 1 0 0 1 0 0 0
1 0 0 0 0 1 0 0
0 0 0 1 0 1 1 0
0 0 1 0 0 0 1 1
1 0 0 0 0 0 0 0
0 1 1 0 0 0 1 0
0 0 1 1 0 1 0 1
0 0 0 1 0 0 1 0
输入BFS遍历的起始结点:2 1 6 5 3 7 4 8

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include
//#include 
#define MAX_VERTICES 100 //假设图有100个顶点
#define MAX_WEIGHT 32767 //加权图(网)不邻接时为10000,但输出为“∞”
#define Maxsize 100typedef struct
{int Vertices[MAX_VERTICES]; //顶点信息的数组int AdjacencyMatrix[MAX_VERTICES][MAX_VERTICES]; //边信息的数组。int numV; //当前的顶点数int numA; //当前的边数
}AdMatrix;
typedef struct
{int  *base;int front;int rear;
}CyQueue;//图的生成函数
void CreateGraph(AdMatrix *G)
{int n, e, vi, vj;printf("请输入顶点数和边数:");scanf("%d,%d", &n, &e);G->numV = n;G->numA = e;//Vertices数组的创建printf("请输入顶点本身的数据:\n");for (int i = 0; i < G->numV; i++){scanf("%d", &G->Vertices[i]);}//AdjacencyMatrix数组的建立printf("请输入边的数据:\n");for (int i = 0; i < G->numA; i++){scanf("%d,%d", &vi, &vj);G->AdjacencyMatrix[vi - 1][vj - 1] = 1;G->AdjacencyMatrix[vj - 1][vi - 1] = 1;}
}
//输出邻接矩阵的信息
void ShowGraph(AdMatrix *G)
{int i, j;for (i = 0; i < G->numV; i++){//printf("\n%d ", i + 1);for (j = 0; j < G->numV; j++){/*if (G->AdjacencyMatrix[i][j] == MAX_WEIGHT){printf("%s ", "∞");}else{printf("%d ", G->AdjacencyMatrix[i][j]);}*/printf("%d ", G->AdjacencyMatrix[i][j]);}printf("\n");}
}/*循环队列基本操作*/
void create(CyQueue *q)
{q->base=(int  *)malloc(Maxsize*sizeof(int));if(!q->base){printf("Space allocation failed!\n");return;}q->front=q->rear=0;return;
}void EnQueue(CyQueue *q,int value)
{if((q->rear+1)%Maxsize==q->front){printf("Cyclic Queue is Full!\n");return;}q->base[q->rear]=value;q->rear=(q->rear+1)%Maxsize;return;
}void DeQueue(CyQueue *q,int *value)
{if(q->front==q->rear){printf("Cyclic Queue is Empty!\n");return;}*value=q->base[q->front];q->front=(q->front+1)%Maxsize;return;
}int QueueEmpty(CyQueue *q)
{if (q->front==q->rear)//队列为空返回1,不为空返回0{return 1;}return 0;
}/*广度优先遍历BFS*/
int visited[MAX_VERTICES];//定义"标志"数组为全局变量void BFS(AdMatrix *G,int i)
{int j;CyQueue q;create(&q);//1.设置起始点printf("%d ",G->Vertices[i]);//1.输出当前结点visited[i]=1;//2.将已访问的结点标志成1EnQueue(&q,i);//3.将第一个结点入队//2.由起始点开始,对后续结点进行操作while(!QueueEmpty(&q)){DeQueue(&q,&i);for(j=0;jnumV;j++){if(G->AdjacencyMatrix[i][j]==1&&visited[j]==0){printf("%d ",G->Vertices[j]);//输出符合条件的顶点visited[j]=1;//设置成已访问状态1EnQueue(&q,j);//入队}}}
}/*void BFSTraverse(AdMatrix *G)
{int i;//数组初始化为全0for(i=0;inumV;i++){visited[i]=0;}for(i=0;inumV;i++){if(visited[i]==0){BFS(G,i);}}
}
*/
int main()
{AdMatrix G;CreateGraph(&G);ShowGraph(&G);printf("输入BFS遍历的起始结点:");int n;scanf("%d",&n);BFS(&G,n-1);return 0;
}

相关内容

热门资讯

百千万·山海间|五口人,50年   你知道吗?  全国每5个柚子,就有1个来自广东梅州。  梅州梅县区雁洋镇的南福村是一个种柚大村。...
转向军国旧路,必将自取灭亡丨新...   日本首相高市早苗近期在国会发表的涉台谬论,绝非简单的“口误”或“失态”,而是一场以国家前途和地区...
持续推进便民建设 各地居民生活...   央视网消息(新闻联播):各地持续推进便民服务设施建设,出台各类民生改善举措,让居民生活更温馨、更...
视频丨跨省奔赴音乐之约 演唱会...   近年来,大型演出市场呈持续上升态势,演唱会、音乐节等演出不但聚集人气带来票房收入,还带动交通、住...
祖国大家庭的温暖丨烘焙坊里爱的...   12月17日,乌鲁木齐新禾特青烘焙坊的烘焙间,水声沥沥。24岁的小赵正熟练地将使用过的工具一一清...
市场监管总局对充电宝等高风险产...   央视网消息:据市场监管总局消息,为严格落实获证生产企业质量安全主体责任,充分发挥CCC认证管理制...
中央纪委国家监委,最新通报!   中央纪委国家监委网站消息,12月22日,中央纪委国家监委公布了2025年11月全国查处违反中央八...
公司账户向法人转账的合规指南 引言在日常企业经营中,公司账户与法人个人账户之间的资金往来是常见的财务管理需求。然而,这种转账行为涉...
​期末账项调整的核心目的是什么 期末账项调整的核心目的是什么账项调整的目的在于按照应收应付标准,合理地反映相互连接的各个会计期间中应...
金融资产公允价值变动会计处理解... 导读本文深入解析以公允价值计量且变动计入其他综合收益的金融资产在处置时的会计处理,重点探讨公允价值变...