本章学习了有关图的概念以及基本操作。
主要学习了邻接矩阵,邻接表,深度搜索以及广度搜索。
其中,邻接矩阵构造简单,方便操作,易于判断两个顶点间是否存在边,即通过A[i][j]=0/1。但是数据量大时,会浪费大量空间,且不利于增删顶点。而领接表方便增删顶点,只需修改指针即可,而且空间利用效率更高,解决了系数矩阵的问题,但是不方便判断两顶点间是否有边的存在。
有关图的术语:
1、生成树:极小连通子图,含有图中全部顶点,只有n-1条边。
2、极小生成树:权值最小的生成树。
有关邻接矩阵和邻接表的存储:
1、邻接矩阵:
#define MVNum 100 //最大顶点数 typedef char VerTexType; //顶点的数据类型 typedef int ArcType; //边的权值类型 typedef struct { VerTexType vexs [MVNum]; //顶点表(一维数组) ArcType arcs [MVNum] [MUNum]; //邻接矩阵 int vexnum, arcnum; //顶点数及边数 } AMGraph;
邻接矩阵
2、
typedef struct ArcNode // { int adjvex; //该边指向顶点的位置 struct ArcNode *nextarc; //下一条边的指针 quanzhi info; //边权值 } ArcNode; typedef struct VNode //顶点信息 { VerTexType data; ArcNode *fiestarc //第一条指该定点的边的指针 }VNode, AdjList [MVNum]; typedef struct { AdjList verices; int vexnum,arcnum; //顶点数 边数 }ALGraph;
邻接表
广度优先遍历:
广度优先遍历,又称为广度优先搜索,简称BFS。图的广度优先遍历就类似于树的层序遍历了。
代码如下:
//广度优先遍历 void BFS(AGraph* G,int v) { ANode *p; queue<int> qu; vector<int> flag(G->n); int w; cout<<v<<" "; flag[v]=1; qu.push(v); while(!qu.empty()) { w = qu.front(); qu.pop(); p = G->adjlist[w]->firstarc; while(p) { if(!flag[p->adjvex]) { cout<<p->adjvex<<" "; flag[p->adjvex] = 1; qu.push(p->adjvex); } p = p->nextarc; } } cout<<endl; }
广
原文地址:https://www.cnblogs.com/chenjianyuan/p/10891308.html
时间: 2024-12-13 06:34:56