图的邻接矩阵实现

图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:
在这里插入图片描述

我们来看一个实例,图7-4-2的左图就是一个无向图。
在这里插入图片描述

我们再来看一个有向图样例,如图7-4-3所示的左图。
在这里插入图片描述

在图的术语中,我们提到了网的概念,也就是每条边上都带有权的图叫做网。那些这些权值就需要保存下来。

设图G是网图,有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:
在这里插入图片描述

如图7-4-4左图就是一个有向网图。

在这里插入图片描述

下面示例无向网图的创建代码:(改编自《大话数据结构》)
————————————————

#include<iostream>


#define MAXVEX 10/*最大顶点数*/
#define INFINITY 65656/*表示权值无穷*/ 
using namespace std;
typedef int EdgeType;
typedef char VertexType;

typedef struct
{
 VertexType vexs[MAXVEX];
 EdgeType arc[MAXVEX][MAXVEX];
 int numNodes,numEdges;//图中当前顶点和边数	
}MGraph; 

/*建立无向图的邻接矩阵表示*/ 
void CreateMGraph(MGraph *Gp)
{
	int i,j,k,w;
	cout<<"请输入顶点数和边数(空格分隔):"<<endl;
	cin>>Gp->numNodes>>Gp->numEdges;
	cout<<"请输入顶点信息"<<endl; 
	for(i=0;i<Gp->numNodes;i++)  //输入顶点 
 	   cin>> Gp->vexs[i];
	for(i=0;i<Gp->numNodes;i++)  //初始化邻接矩阵 
	{
		for(j=0;j<Gp->numNodes;j++)
		{
			if(i==j)
			    Gp->arc[i][j]=0;//顶点没有到自己的边
			else
 				Gp->arc[i][j]=INFINITY;//初始化边为无穷 
		}
	}
	/*输入边的上下标和权值*/ 
	for(k=0;k<Gp->numEdges;k++)
	{
		cout<<"请输入"<<Gp->numEdges<<"个边(Vi,Vj)的上标、下标和权值w(空格分隔)"<<endl; 
		cin>>i>>j>>w;
		Gp->arc[i][j]=w;
	 	Gp->arc[j][i]=Gp->arc[i][j];//对称矩阵 
 	}
}



int main(void)
{
    MGraph MG;
    CreateMGraph(&MG);

    return 0;
}
  • 21
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是基于邻接矩阵实现的各种基本操作的完整代码,包括创建、插入边、删除边、检查边、打印等。 ```c++ #include <iostream> #include <vector> using namespace std; // 定义邻接矩阵表示的类 class Graph { private: int V; // 的顶点数 vector<vector<int>> adj; // 邻接矩阵,用于存储边的信息 public: // 构造函数 Graph(int v) { V = v; adj.resize(V, vector<int>(V, 0)); } // 添加一条边 void addEdge(int u, int v) { adj[u][v] = 1; adj[v][u] = 1; } // 删除一条边 void removeEdge(int u, int v) { adj[u][v] = 0; adj[v][u] = 0; } // 检查是否存在一条边 bool hasEdge(int u, int v) { return adj[u][v] == 1; } // 打印 void printGraph() { for (int i = 0; i < V; i++) { cout << "Vertex " << i << " is connected to: "; for (int j = 0; j < V; j++) { if (adj[i][j] == 1) { cout << j << " "; } } cout << endl; } } }; int main() { // 创建一个有5个顶点的 Graph g(5); // 添加一些边 g.addEdge(0, 1); g.addEdge(0, 4); g.addEdge(1, 2); g.addEdge(1, 3); g.addEdge(1, 4); g.addEdge(2, 3); g.addEdge(3, 4); // 检查某些边是否存在 cout << "Does edge (1, 4) exist? " << g.hasEdge(1, 4) << endl; cout << "Does edge (2, 4) exist? " << g.hasEdge(2, 4) << endl; // 删除一些边 g.removeEdge(1, 4); g.removeEdge(3, 4); // 打印 g.printGraph(); return 0; } ``` 运行上述代码,输出结果如下: ``` Does edge (1, 4) exist? 1 Does edge (2, 4) exist? 0 Vertex 0 is connected to: 1 4 Vertex 1 is connected to: 0 2 3 Vertex 2 is connected to: 1 3 Vertex 3 is connected to: 1 2 Vertex 4 is connected to: 0 ``` 可以看到,该代码实现了基本的操作,并且能够正确地检查边、添加边、删除边和打印

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值