图论——邻接矩阵之无向网

在此之前,我们需要先理清图和网的区别

  1. 1.图G:有两个集合,边集V和点集E【点集用来存放各个顶点,边集用来存放各条边来表示关联两点的联系】
  2. 2.权值:即即两顶点之间互相往来需要花费的代价或消耗
  3. 3.网:带权值的图

所谓邻接矩阵,即用矩阵排布的方式来构建两点之间的关系

  • 1.针对图,邻接矩阵采用[0-1]排布【即两点之间有边就写1代表能通过,没有边就写0代表无法通过】
  •  另外,在这里我们对图的邻接矩阵进行讨论的时候,是默认点到自身也是没有边的
  • 针对网,邻接矩阵采用[权值-∞]分布【即两点之间有边就写边上所带的权值代表距离损耗,没有边就写∞代表无法到达】
  •  另外,会了方便,我们对于网的邻接矩阵中自身到自身的损耗也写成∞而非0

好了,概念说完了,我们接下来进行代码理解

因为网包含了图且附加了权值比较全面,所以我们拿无向网来作为例子

无向网的邻接矩阵存储定义:

const int mvnum = 100;//最大顶点个数 
#define MaxInt 36767//代表无穷 
typedef int vexType;//顶点数据类型 
typedef int edgeType;//边的数据类型 
//邻接矩阵 
typedef struct Graph{
	vexType vertex[mvnum];//点集 
	edgeType edge[mvnum][mvnum];//边集 
	int vexnum,edgenum;//顶点个数,边的个数 
}Graph;

针对无向网,我们来声明几个基本操作,例如创建无向网和遍历无向网

void CreateGraph(Graph &G);//创建无向网 
int LocateVex(Graph &G,int v);//顶点的定位 
void Traverse(Graph &G); //网的遍历 

代码实现:

#include <iostream>
using namespace std;

const int mvnum = 100;//最大顶点个数 
#define MaxInt 36767//代表无穷 
typedef int vexType;//顶点数据类型 
typedef int edgeType;//边的数据类型 
//邻接矩阵 
typedef struct Graph{
	vexType vertex[mvnum];//点集 
	edgeType edge[mvnum][mvnum];//边集 
	int vexnum,edgenum;//顶点个数,边的个数 
}Graph;

void CreateGraph(Graph &G);//创建无向网 
int LocateVex(Graph &G,int v);//顶点的定位 
void Traverse(Graph &G); //网的遍历 

void CreateGraph(Graph &G){
	cout<<"顶点个数:";
	cin>>G.vexnum;
	cout<<"边数:";
	cin>>G.edgenum; //确定该网的顶点个数与边数
	cout<<"点集:";
	for(int i=0;i<G.vexnum;++i){
		cin>>G.vertex[i]; //对顶点进行赋值 
	} 
	for(int i=0;i<G.vexnum;++i){
		for(int j=0;j<G.vexnum;++j){
			G.edge[i][j]=MaxInt;//因为是网,所以先提前把每两个顶点之间的边的权值设为无穷大 
		}
	}
	cout<<"构建无向网"<<endl; 
	for(int k=0;k<G.edgenum;++k){
		vexType v1,v2;
		edgeType w;
		cin>>v1>>v2>>w;//输入想要添加的边的权值以及边所依附的两顶点 
		int i=LocateVex(G,v1),j=LocateVex(G,v2);//确定两顶点在图中的位置
		G.edge[i][j]=w;
		G.edge[j][i]=G.edge[i][j];//由于无向网具有对称性,因此可以对称赋值 
	}
}

int LocateVex(Graph &G,int v){
	for(int i=0;i<G.vexnum;++i){
		if(v==G.vertex[i])	return i;
	} 
	return -1;
}

void Traverse(Graph &G){
	for(int i=0;i<G.vexnum;++i)
		for(int j=0;j<G.vexnum;++j)
			if(G.edge[i][j]!=MaxInt)
				cout<<"("<<G.vertex[i]<<" "<<G.vertex[j]<<") 权值:"<<G.edge[i][j]<<endl;
}

int main(){
	Graph g;
	CreateGraph(g);
	Traverse(g);
	return 0 ;
}

文章来源地址https://uudwc.com/A/LLjg

原文地址:https://blog.csdn.net/m0_54566774/article/details/121629012

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年06月16日 06:09
黑鲨给电脑重装系统的详细步骤
下一篇 2023年06月16日 06:09