一、要求
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; }
运行结果
2.
#include<stdio.h> #include<stdlib.h> #define MAX_SIZE 20 int visited[MAX_SIZE]; typedef struct queue { int Data[MAX_SIZE]; int front; int rear; }SqQueue; typedef struct ArcNode { int adjvex;//该弧指向顶点的位置 struct ArcNode *next; }ArcNode; typedef struct vnode { int data;//顶点信息 ArcNode *first;//指向第一条依附该顶点的弧的指针 }VNode; typedef struct { VNode vertices[MAX_SIZE]; int vexnum; int edgenum; }ALGraph; void init_queue(SqQueue *); void EnQueue(SqQueue *,int); void DeQueue(SqQueue *); int empty_queue(SqQueue *); void DFSTraverse(ALGraph *G); void DFS(ALGraph *G,int v); void BFSTraverse(ALGraph G); void createALGraph(ALGraph *); int main() { ALGraph G; createALGraph(&G); DFSTraverse(&G); printf("\n"); BFSTraverse(G); return 0; } void DFSTraverse(ALGraph *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(ALGraph *G,int v) { ArcNode *p; p = G->vertices[v].first; visited[v]=1; printf("%d ",G->vertices[v].data); while(p) { if(!visited[p->adjvex]) DFS(G,p->adjvex); p=p->next; } } void BFSTraverse(ALGraph G) { SqQueue Q; ArcNode *p; for(int i=0;i<G.vexnum;i++) visited[i]=0; init_queue(&Q); for(int i=0;i<G.vexnum;i++) { p = G.vertices[0].first; if(!visited[i]) { visited[i]=1; printf("%d ",G.vertices[i].data); EnQueue(&Q,i); } while(!empty_queue(&Q)) { DeQueue(&Q); while(p) { if(!visited[p->adjvex]) { visited[p->adjvex]=1; printf("%d ",G.vertices[p->adjvex].data); EnQueue(&Q,i); } p=p->next; } } } } 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; } void createALGraph(ALGraph *G) { int i, j; ArcNode *e; printf("输入顶点数和边数:\n"); scanf("%d %d",&G->vexnum,&G->edgenum); printf("输入顶点"); for(i = 0; i < G->vexnum; i++) { scanf("%d", &G->vertices[i].data); G->vertices[i].first = NULL; } //输入边 printf("输入边(i, j)上的顶点:\n"); for(int k = 0; k < G->edgenum; k++) { scanf("%d %d", &i, &j); e = (ArcNode *) malloc (sizeof (ArcNode)); e->adjvex = j; e->next = G->vertices[i].first; G->vertices[i].first = e; e = (ArcNode *) malloc (sizeof (ArcNode)); e->adjvex = i; e->next = G->vertices[j].first; G->vertices[j].first= e; } }
运行结果:
千百度
© 版权声明
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
THE END
暂无评论内容