#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define MAX 50
#define INFINITY 65535 //无穷大
typedef char Elemtype;
typedef int Status;
typedef struct TNode{
Elemtype vex[MAX]; //顶点数
Status arc[MAX][MAX]; //对应权值或(0,1)
Status V,E; //顶点与边数
//Status weigh;
}Graph;
typedef struct {
int data[MAX];
int front, rear;
}Queue;
Status visit[MAX];
//队列顺序表的相关操作
//初始化
void InitQueue(Queue *Q)
{
Q->front = Q->rear = 0;
}
//入队
void EnQueue(Queue *Q, int e)
{
if ((Q->rear+1)%MAX == Q->front)
return ;
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%MAX;
}
//判空
int QueueEmpty(Queue *Q)
{
if (Q->front == Q->rear)
return 1;
else
return 0;
}
//出队
void DeQueue(Queue *Q, int *e)
{
if (Q->front == Q->rear)
return ;
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MAX;
}
void Create_Graph(Graph &G){ //G一定要有&引用
printf("输入顶点与边的数目:\n");
scanf("%d%d",&G.V,&G.E);
getchar() ;
printf("输入顶点值:\n");
for(int i = 0;i<G.V;i++){
scanf("%c",&G.vex[i]) ;
getchar();
}
/*初始化*/
for(int i = 0;i<G.V;i++){
for(int j = 0;j<G.V;j++){
G.arc[i][j] = INFINITY;
}
}
int k,t,w;
//边处理
printf("输入邻接矩阵对应的下标及对应权值\n");
for(int i = 0;i<G.E;i++){
scanf("%d%d%d",&k,&t,&w);
G.arc[k][t] = w; //指向权值
G.arc[t][k] = G.arc[k][t]; //无向图对称
}
}
/*深度遍历*/
void DFS(Graph G,Status i){
visit[i] = 1; //访问点置1,从此往内探索
printf("%c ",G.vex[i]);
for(int j=0; j<G.V;j++){
//int item = j;
if(!visit[j]&&G.arc[i][j]!=INFINITY){
DFS(G,j);
}
}
}
/*初始化标志visit确定深度遍历位置*/
void Traver_Graph(Graph G){
for(int i = 0;i<G.V;i++){
visit[i] = 0;
}
for(int j = 0;j<G.V;j++){
if(!visit[j]){
DFS(G,j);
}
}
}
/*广度遍历*/
void BFSTraverse(Graph *G)
{
int i, j;
Queue Q;
for (i=0; i<G->V; ++i)
visit[i] = 0;
InitQueue(&Q); //构造空队列
for (i=0; i<G->V; ++i)
{
if (!visit[i])
{
visit[i] = 1; //访问点置1
printf("%c ", G->vex[i]);
EnQueue(&Q, i); //访问过的位置进队列
while (!QueueEmpty(&Q))
{
DeQueue(&Q, &i); //要访问的节点出队列;
for (j=0; j<G->V; ++j) //访问与它关联的全部邻节点,且按照先与之关联的先输出
{
if (!visit[j] && G->arc[i][j]!=INFINITY)
{
visit[j] = 1; //访问点置1
printf("%c ", G->vex[j]);
EnQueue(&Q, j); //进队列,下次广度搜索从此节点开始
}
}
}
}
}
}
int main(int argc, char** argv) {
Graph G;
Create_Graph(G);
printf("\n图的深度优先遍历为:\n");
Traver_Graph(G);
printf("\n图的广度优先遍历为:\n");
BFSTraverse(&G);
return 0;
}
图的邻接矩阵的建立以及遍历操作
原文作者:数据结构之图
原文地址: https://blog.csdn.net/lfb637/article/details/78614246
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/lfb637/article/details/78614246
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。