一、要求
1.设计并验证如下算法:图采用邻接矩阵表示,实现无向图的深度优先搜索与有向图的广度优先搜索。
2.设计并验证如下算法:带权图采用邻接表表示,实现无向图的广度优先搜索与有向图的深度优先搜索。
二、代码
1.- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- #define INFINITY INT_MAX
- #define MAX_VERTEX_NUM 20
- typedef struct queue
- {
- int Data[MAX_VERTEX_NUM];
- int front;
- int rear;
- }SqQueue;
- int visited[MAX_VERTEX_NUM];//1--已访问 0--未访问
- typedef struct mgraph
- {
- char vexs[MAX_VERTEX_NUM];//顶点向量
- int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
- int vexnum;//图的顶点数
- }Mgraph;
- void init_queue(SqQueue *);
- void EnQueue(SqQueue *,int);
- void DeQueue(SqQueue *);
- int empty_queue(SqQueue *);
- void DFS(Mgraph G,int v);
- void DFSTraverse(Mgraph G);
- void BFSTraverse(Mgraph G);
- int main()
- {
- Mgraph G;
- printf("请输入图的顶点数\n");
- scanf("%d",&G.vexnum);
- printf("输入图的各个顶点向量\n");
- scanf("%s",&G.vexs);
- srand((unsigned)time(NULL));
- for(int i=0;i<G.vexnum;i++)//随机生成邻接矩阵
- {
- for(int j=0;j<G.vexnum;j++)
- G.arcs[i][j]=rand()%2;
- }
- printf("该图的邻接矩阵如下:\n");
- for(int i=0;i<G.vexnum;i++)//随机生成邻接矩阵
- {
- for(int j=0;j<G.vexnum;j++)
- printf("%d ",G.arcs[i][j]);
- printf("\n");
- }
- printf("深度优先遍历结果如下:\n");
- DFSTraverse(G);
- printf("\n");
- printf("广度优先遍历结果如下:\n");
- BFSTraverse(G);
- return 0;
- }
- void DFSTraverse(Mgraph G)
- {
- for(int v=0;v<G.vexnum;v++)//标记赋值为未访问
- visited[v]=0;
- for(int v=0;v<G.vexnum;v++)//调用DFS
- if(!visited[v])
- DFS(G,v);
- }
- void DFS(Mgraph G,int v)
- {
- visited[v]=1;
- printf("%c ",G.vexs[v]);
- for(int n=0;n<G.vexnum;n++)
- {
- if((visited[n]==0)&&(G.arcs[v][n]==1))
- DFS(G,n);
- }
- }
- void BFSTraverse(Mgraph G)//广度优先遍历
- {
- SqQueue Q;
- for(int i=0;i<G.vexnum;i++)
- visited[i]=0;
- init_queue(&Q);
- for(int i=0;i<G.vexnum;i++)
- {
- if(!visited[i])
- {
- visited[i]=1;
- printf("%c ",G.vexs[i]);
- EnQueue(&Q,i);
- }
- while(!empty_queue(&Q))
- {
- DeQueue(&Q);
- for(int j=0;j<G.vexnum;j++)
- {
- if(!visited[j]&&G.arcs[i][j])
- {
- visited[j]=1;
- printf("%c ",G.vexs[j]);
- EnQueue(&Q,j);
- }
- }
- }
- }
- }
- void init_queue(SqQueue *Q)
- {
- Q->front=Q->rear=0;
- }
- void EnQueue(SqQueue *Q,int e)
- {
- Q->Data[Q->rear]=e;
- Q->rear++;
- }
- void DeQueue(SqQueue *Q)
- {
- Q->front++;
- }
- int empty_queue(SqQueue *Q)
- {
- if(Q->front==Q->rear)
- return 1;
- else
- return 0;
- }
复制代码
运行结果:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |