第十一周项目实践3 DFS(深度优先搜索)的基本模板
来源:互联网 发布:python实现串口通信 编辑:程序博客网 时间:2024/06/15 13:24
测试时用的图是,可以使用其他类型的图代替。
graph.h#ifndef GRAPH_H_INCLUDED#define GRAPH_H_INCLUDED#define MAXV 100 //最大顶点个数#define INF 32767 //INF表示∞typedef int InfoType;//以下定义邻接矩阵类型typedef struct{ int no; //顶点编号 InfoType info; //顶点其他信息,在此存放带权图权值} VertexType; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV]; //邻接矩阵 int n,e; //顶点数,弧数 VertexType vexs[MAXV]; //存放顶点信息} MGraph; //图的邻接矩阵类型//以下定义邻接表类型typedef struct ANode //弧的结点结构类型{ int adjvex; //该弧的终点位置 struct ANode *nextarc; //指向下一条弧的指针 InfoType info; //该弧的相关信息,这里用于存放权值} ArcNode;typedef int Vertex;typedef struct Vnode //邻接表头结点的类型{ Vertex data; //顶点信息 int count; //存放顶点入度,只在拓扑排序中用 ArcNode *firstarc; //指向第一条弧} VNode;typedef VNode AdjList[MAXV]; //AdjList是邻接表类型typedef struct{ AdjList adjlist; //邻接表 int n,e; //图中顶点数n和边数e} ALGraph; //图的邻接表类型void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表#endif // GRAPH_H_INCLUDEDgraph.cpp#include <stdio.h>#include <malloc.h>#include "graph.h"//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)// n - 矩阵的阶数// g - 要构造出来的邻接矩阵数据结构void ArrayToList(int *Arr, int n, ALGraph *&G){ int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数 ArcNode *p; G=(ALGraph *)malloc(sizeof(ALGraph)); G->n=n; for (i=0; i<n; i++) //给邻接表中所有头节点的指针域置初值 G->adjlist[i].firstarc=NULL; for (i=0; i<n; i++) //检查邻接矩阵中每个元素 for (j=n-1; j>=0; j--) if (Arr[i*n+j]!=0) //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]=Arr[i][j](n是有多少列) { p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p p->adjvex=j; p->info=Arr[i*n+j]; p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p,和链表的操作一样 G->adjlist[i].firstarc=p; } G->e=count;}main.cpp#include <stdio.h>#include <malloc.h>#include "graph.h"int visited[MAXV];void DFS(ALGraph *G, int v){ ArcNode *p; int w; visited[v]=1; printf("%d ", v); p=G->adjlist[v].firstarc; while (p!=NULL) { w=p->adjvex; if (visited[w]==0) DFS(G,w); p=p->nextarc; }}int main(){ int i; ALGraph *G; int A[5][5]= { {0,1,0,1,0}, {1,0,1,0,0}, {0,1,0,1,1}, {1,0,1,0,1}, {0,0,1,1,0} }; ArrayToList(A[0], 5, G); for(i=0; i<MAXV; i++) visited[i]=0; printf(" 由2开始深度遍历:"); DFS(G, 2); printf("\n"); for(i=0; i<MAXV; i++) visited[i]=0; printf(" 由0开始深度遍历:"); DFS(G, 0); printf("\n"); return 0;}
阅读全文
0 0
- 第十一周项目实践3 DFS(深度优先搜索)的基本模板
- 第十一周项目实践4 BFS(广度优先搜索)基本模板
- DFS深度优先搜索(1)--poj3984(基本模板题)
- 第十一周 项目三 “深度优先遍历”
- 图的深度优先搜索(DFS)
- 第十一周-项目4-3-应用图的深度优先遍历思路求解问题
- 第十一周项目三 图遍历算法的实现(1)深度优先遍历
- 深度优先搜索 (DFS)
- 深度优先搜索(DFS)
- 深度优先搜索(DFS)
- DFS(深度优先搜索)
- 深度优先搜索(dfs)
- DFS(深度优先搜索)
- 深度优先搜索 (DFS)
- 深度优先搜索(DFS)
- 深度优先搜索(dfs)
- 深度优先搜索(dfs)
- 深度优先搜索(dfs)
- 第11周项目2
- 人脸属性多任务学习:Heterogeneous Face Attribute Estimation: A Deep Multi-Task Learning Approach
- 用CSS3实现响应式的瀑布流
- SpringBoot初学
- GIC相关
- 第十一周项目实践3 DFS(深度优先搜索)的基本模板
- 很不错的两款icon图标选择组件
- 2017年第12届上海国际淀粉及淀粉衍生物展览会会刊(参展商名录)
- 课程表-LintCode
- <s:if></s:if>标签使用
- 类和实例、数据封装
- 【腾讯Bugly干货分享】Android内存优化总结&实践
- 第十一周 项目四 利用遍历思想求解图问题
- 创新工场汪华:OMO 时代,谁是下一个领跑者?