数据结构与算法(图)

25 阅读2分钟

在本文中,主要用来记录数据结构考试中,常见以及基础的图的考点。

1. 图的常见存储结构

1. 1. 邻接矩阵表示法

我们可以利用矩阵来对图进行存储,矩阵大小为图顶点个数的平法,如果两顶点之间存在路径,矩阵中两顶点所在行列交点为1或者该路径的权值。

以下是用邻接矩阵表示法存储无向带权图

//------图的邻接矩阵存储表示法------
#define MaxInt 32767                 //表示极大值,∞	
#define MVNum 100                    //最大顶点数
typedef char VerTexType;             //假设顶点的数据类型为字符型
typedef int ArcType;                 //假设边的权值类型为整型
	
typedef struct{
    VerTexType vexs[MVNum];      //顶点表
    ArcType arcs[MVNum][MVNum];  //邻接矩阵
    int vexnum,arcnum;
}AMGraph

采用邻接矩阵表示法来创建无向网

  • 1.输入总顶点数和总边数
  • 2.依次输入点的信息存入顶点表中
  • 3.初始化邻接矩阵,使每个权值初始值最大值(无向带权图)
  • 4.构造邻接矩阵。依次输入每条边依附的顶点和权重,确定两个顶点在图中位置之后,使相应边赋予相应的权值,同时使对称边赋予相同的权值。

算法描述

Status CreateUDN(AMGraph &G){
	//对邻接矩阵初始化
	cin>>G.vexnum>>G.arcnum;                       //输入总顶点数,总边数
	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]=MaxInt;          //对所有权值初始化值为∞
		
	//构造邻接矩阵
	for(k=0;k<G.arcnum;++k){
		cin>>v1>>v2>>w;                       //输入一条边依附的顶点以及权值
		i=LocateVex(G,v1);                    //找到v1v2在G中位置,即数组下标
		j=LocateVex(G,v2);
		G.arcs[i][j]=w;                       //修改边<v1,v2>的权值
		G.arcs[j][i]=arcs[i][j];              //修改对称边的权重
	}
        return OK;		
}

1. 2. 邻接表表示法

邻接表法首先要定义两存放顶点的头结点以及边的边结点。

#define MVNum 100                        //最大顶点数
typedef struct ArcNode{
	int adjvex;                            //边
	struct AcrNode* nextarc;               //下一个节点指针
        // Infotype info;
}ArcNode;
typedef struct VNode{
	VerTexType data;
	ArcNode *firstarc;
}VNode,AdjList[MVNum];

typedef struct{
	AdjList vertices;
	int vexnum,arcum;
}ALGraph;

采用邻接表法创建一个无向图

1.输入总顶点数和总边数 2.依次输入顶点信息,使每个表头结点指针初始化为NULL 3.创建邻接表,依次输入每条边依附的两个顶点,确定这两个顶点的序号i和j后,将这两个边结点分别插入vi 和vj 对应的两个边链表的头部

Status CreateUDG(ALGraph &G){
	cin>>G.vexnum>>G.arcnum;
	for(i=0;i<G.vexnum;++i){
		cin>>G.vertices[i].data;
		G.vertices[i].firstarc=NULL;
	}
	
	//构造邻接表	
	for(k=0;k<G.arcnum;++k){
		cin>>v1>>v2;
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		p1=new ArcNode;
		p1->adjvex=j;
		p1->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=p1;

		p2=new ArcNode; p2->adjvex=i;
		p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;
	}
	return OK;
}