数据结构——图
- 格式:ppt
- 大小:550.50 KB
- 文档页数:65
主 题: 《数据结构》学习笔记内 容:《数据结构》学习笔记五——图一、图的概念:1、术语:有向图,无向图,子图,顶点,边,弧,邻接点,出度,入度,路径,连通图。
2、图的存储:2.1邻接矩阵:0 1 1 0 0 1 0 1 00 0 0 0 1 0 1 0 10 0 0 1 0 1 0 1 11 0 0 0 1 0 1 0 00 1 1 0 02.2邻接表:2 3 ^4 ^1 ^Struct node{int data;struct node *next;}struct node V[n+1];3、程序:3.1已知邻接表,建立邻接矩阵。
{……for(I=1;I<=n;I++)for(j=1;j<=n;j++)w[I][j]=0;for(I=1;I<=n;I++){p=v[I].next;while(p){j=p->data;w[I][j]=1;p=p->next;}}}3.2已知邻接矩阵,建立邻接表。
{……for(I=1;I<=n;I++)v[I].next=0;for(I=1;I<=n;I++)for(j=1;j<=n;j++)if (w[I][j]= =1){p=(……)malloc(……);p->data=j;p->next=v[I].next;v[I].next=p;}}1、广度优先遍历1.1作法:(i)初始化(打印,加标记,进队)(ii)出队.(J)(iii)扫描(J)链,遇未访问点,则打印,加标记,进队.返回ii,直至队空.1.2 结果:2、深度优先遍历:2.1作法:从某点进入,打印,加标记,扫描此链:如没遇到未访问点,则返到原转来点.算法结束于进入点那个链的链尾.2.2 结果:1,2,4,8,5,3,6,73、广度优先程序:bfs(I)int I;{……f=0; r=0;for(t=1;t<=n;t++)v[t].data=0;printf(“%d”,I);v[I].data=1;r++; q[r]=I;while(f!=r){f++; j=q[f];p=v[j].next;while(p){k=p->data;if(v[k].data= =0){printf(“%d”,k);v[k].data=1;r++;q[r]=k;}p=p->next;}}}4、深度优先程序:dfs(I)int I;{……v[I].data=1;printf(“%d”,I);p=v[I].next;while(p){j=p->data;if(v[j].data= =0)dfs(j);p=p->next;}}三、最小生成树:1、解法11.1问题:选哪几条边,使得(I)能连到各点(II)边长之和最小?1.2思路:i. 从当前点集的发出边中选最小者,打印。
1.采用邻接矩阵(邻接表)存储,构造无向图(网)输入:顶点数、边数、顶点信息、边信息输出:图的顶点,图的边邻接矩阵(数组表示法)处理方法:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。
假设图G=(V,E)有n个顶点,则邻接矩阵是一个n×n 的方阵,定义为:如果(vi,vj)属于边集,则edges[i][j]=1,否则edges[i][j]=0。
邻接表存储的处理方法:对于图的每个顶点vi,将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边表(对于有向图则称为出边表),所有边表的头指针和存储顶点信息的一维数组构成了顶点表。
程序代码:#include<iostream>using namespace std;#define MAX_VERTEX_NUM 20 //最大顶点个数#define OK 1typedef int Status;//图的数组(邻接矩阵)存储表示typedef struct ArcCell { // 弧的定义int adj; // VRType是顶点关系类型。
// 对无权图,用1或0表示相邻否;// 对带权图,则为权值类型。
int *info; // 该弧相关信息的指针} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct { // 图的定义char vexs[MAX_VERTEX_NUM];//顶点向量AdjMatrix arcs; // 邻接矩阵int vexnum, arcnum; // 图的当前顶点数、弧数} MGraph;int LocateV ex(MGraph G, char v){int a;for (int i = 0; i <= G.vexnum; i++){if (G.vexs[i] == v)a= i;}return a;}Status CreateUDN(MGraph &G) { //采用邻接矩阵表示法,构造无向网Gint i, j, k, w;char v1, v2;cout <<"输入顶点数,边数:"<< endl;cin >> G.vexnum >> G.arcnum;//IncInfo为0,表示各弧无信息cout <<"各顶点分别为:"<< endl;for (i = 0; i<G.vexnum; i++)cin >> G.vexs[i]; //构造顶点向量for (i = 0; i<G.vexnum; i++) //初始化邻接矩阵for (j = 0; j<G.vexnum; j++){G.arcs[i][j].adj =NULL;}cout <<"顶点信息、边信息:"<< endl;for (k = 0; k<G.arcnum; k++) { //构造邻接矩阵cin >> v1 >> v2 >> w; //输入一条边依附的顶点及权值i = LocateV ex(G, v1); j = LocateV ex(G, v2);G.arcs[i][j].adj = w;G.arcs[j][i] = G.arcs[i][j];} return OK;} //CreateUDN (p162 算法7.2)Status printf1(MGraph G){cout <<"该图的顶点分别为:";for (int i = 0; i<G.vexnum; i++)cout << G.vexs[i] <<"";return OK;}Status printf2(MGraph G){cout <<"该图的边为:";for (int i = 1; i<G.vexnum; i++) //初始化邻接矩阵for (int j = 0; j<i; j++){if (G.arcs[i][j].adj !=NULL)cout << G.vexs[j]<< G.vexs[i] <<"," ;}return OK;}int main(){MGraph G;CreateUDN(G);printf1(G);cout << endl;printf2(G);cout << endl;system("pause");return 0;}。
数据结构——图图是一种重要的数据结构,它以顶点和边的方式来表示数据之间的关系。
在计算机科学和信息技术领域,图被广泛应用于解决各种问题,如网络路由、社交网络分析和数据挖掘等。
本文将介绍图的基本概念、表示方法和常见算法,以及图在实际应用中的一些案例。
一、图的基本概念图是由顶点集合和边集合组成的有序对,用G=(V,E)表示,其中V表示顶点集合,E表示边集合。
图可以分为有向图和无向图两种类型,有向图的边具有方向性,无向图的边没有方向性。
1. 顶点(Vertex):图中的一个元素,可以用来表示某个实体。
2. 边(Edge):顶点之间的连接关系,可以用来表示实体之间的关联。
3. 路径(Path):在图中顶点之间经过的一系列边和顶点构成的序列。
4. 环(Cycle):在图中由一个顶点开始经过若干边后再回到该顶点的路径。
5. 连通图(Connected Graph):图中任意两个顶点之间存在路径。
二、图的表示方法图可以使用邻接矩阵和邻接表两种方式进行表示。
1. 邻接矩阵:邻接矩阵是一个二维数组,其中数组元素表示顶点之间的边,若两个顶点之间存在边,则对应元素为1或权重值,否则为0或无穷大。
2. 邻接表:邻接表由一个顶点数组和一个边链表组成,顶点数组存储顶点的信息,边链表存储每个顶点的邻接顶点。
三、常见图算法图的常见算法包括深度优先搜索(DFS)和广度优先搜索(BFS)、最短路径算法(Dijkstra算法和Floyd算法)以及最小生成树算法(Prim算法和Kruskal算法)等。
1. 深度优先搜索(DFS):从图的一个顶点出发,沿着一条路径一直深入直到没有未访问过的邻接顶点,然后返回并查找其他路径。
DFS 可以用于查找连通图中的所有顶点以及判断图中是否存在环等。
2. 广度优先搜索(BFS):从图的一个顶点出发,首先访问其所有邻接顶点,然后按照相同的方式访问每个邻接顶点的邻接顶点,直到所有顶点都被访问。
BFS可以用于查找最短路径、拓扑排序以及解决迷宫等问题。
稀疏图、稠密8.4 图的连通性判定一个图的连通性是图的一个应用问题,我们可以利用图的遍历算法来求解这一问题。
本节将重点讨论无向图的连通性、有向图的连通性、由图得到其生成树或生成森林以及连通图中是否有关节点等几个有关图的连通性的问题。
8.4.1 无向图的连通性在对无向图进行遍历时,对于连通图,仅需从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。
对非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。
例如,图8.5 (a)是一个非连通图G3,按照图8.18 所示G3 的邻接表进行深度优先搜索遍历,需由算法8.5调用两次DFS(即分别从顶点A 和D出发),得到的顶点访问序列分别为:A B F E C E这两个顶点集分别加上所有依附于这些顶点的边,便构成了非连通图G3的两个连通分量,如图8.5(b) 所示。
因此,要想判定一个无向图是否为连通图,或有几个连通分量,就可设一个计数变量count,初始时取值为0,在算法8.5的第二个for循环中,每调用一次DFS,就给count增1。
这样,当整个算法结束时,依据count的值,就可确定图的连通性了。
序号图8.18 G3的邻接表8.4.3 生成树和生成森林在这一小节里,我们将给出通过对图的遍历,得到图的生成树或生成森林的算法。
设E(G)为连通图G中所有边的集合,则从图中任一顶点出发遍历图时,必定将E(G)分成两个集合T(G)和B(G),其中T(G)是遍历图过程中历经的边的集合;B(G)是剩余的边的集合。
显然,T(G)和图G 中所有顶点一起构成连通图G 的极小连通子图。
按照8.1.2节的定义,它是连通图的一棵生成树,并且由深度优先搜索得到的为深度优先生成树;由广度优先搜索得到的为广度优先生成树。
例如,图8.17(a)和(b)所示分别为连通图G5的深度优先生成树和广度优先生成树。