图的邻接矩阵存储结构

如上图,我们可以把v0标记为0,v1标记为1。。。。

并把联通的2点权值全设置为1,那么可以用邻接矩阵(右图)来表示

概念解析:

第一个邻接顶点:

我们以vo为例,第一个邻接顶点为V1(其实也可以使V3,只不过考虑计算机的存储顺序,我们找邻接顶点,一般是从v0扫描到v3,所以我们先在内存中扫描到v1)

下一个邻接顶点:

我们以v0为例,下一个邻接顶点就是v3(同样,其实也可以使V1,只不过考虑计算机的存储顺序,我们找下个邻接顶点,一般是从v2扫描到v3,之所以从v2扫描起,那是因为,V1已经是第一个邻接顶点了,那么下一个邻接顶点一定是在内存中存储在V1后的数据了)

无向图邻接矩阵的特点:

对角线权值是0

无向图矩阵关于斜线对称(有向图不对称)

代码如下:

#include<iostream>
using namespace std;
#define VertexSize 10
typedef struct
{
	int weight[VertexSize][VertexSize];  //表示2个顶点之间的权值
	int edgenum; //表示图的边数目
}Graph;

//初始化图
void Initiate_Graph(Graph *g,int n)
{
	int i,j;
	g->edgenum=0;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			if(i==j) g->weight[i][j]=0;  //对角线表示顶点自己到自己,权值为0
			else g->weight[i][j]=0x7fff; //其他权值初始化为无限大
		}
}

//插入边
void InsertEdge(Graph *g,int v,int w,int weight,int n)
{
	if(v<0 || v>=n||w<0||w>=n)
	{
		cout<<"overflow!"<<endl;
	}
	g->weight[v][w]=weight;
	g->edgenum++;
}

//取得点V的第一个临接顶点
int GetFirstVertex(Graph *g,int v,int n)
{
	if(v<0||v>=n)
	{
		cout<<"overflow"<<endl;
		return -1;
	}
	int i;
	for(i=0;i<n;i++)
	{
		if(( (g->weight[v][i])>0 )&&( (g->weight[v][i])<0x7fff) )
			return i;
	}
	return -1;

}

//取得顶v的下一个邻接顶点
int GetNextVertex(Graph *g,int v,int w,int n)
{
	if(v<0||v>=n||w<0||w>=n)
	{
		cout<<"overflow"<<endl;
		return -1;
	}
	int i;
	for(i=w+1;i<n;i++)
	{
		if( ((g->weight[v][i])>0 )&& ((g->weight[v][i])<0x7fff ))
			return  i;
	}
	return -1;
}

//删除边
void DeleteEdge(Graph *g,int v,int w,int n)
{
	if(v<0||v>=n||w<0||w>=n||v==w)
	{
		cout<<"error"<<endl;
	}
	g->weight[v][w]=0x7fff;
	g->edgenum--;
}

void PrintGraph(Graph *g,int n)
{
	int y,x,i;
	for(i=0;i<n;i++)
	{
		y=GetFirstVertex(g,i,n);
		if(y==-1)
		{
			cout<<"Vertex:"<<i<<"没有第一个邻接顶点"<<endl;
		}
		else
		{
			cout<<"Vertex:"<<i<<"第一个邻接顶点"<<y<<endl;
			x=GetNextVertex(g,i,y,n);
			if(x!=-1)
			{
				cout<<"Vertex:"<<i<<"下一个邻接顶点"<<x<<endl;
			}
			else
			{
				cout<<"Vertex:"<<i<<"没有第二个邻接顶点"<<endl;
			}
		}
	}
}

void main()
{
	Graph g;
	int n,edge;
	cout<<"请输入图的顶点个数:"<<endl;
	cin>>n;
	cout<<"请输入图的边个数"<<endl;
	cin>>edge;
	Initiate_Graph(&g,n);
	int i,p1,p2,weight;
	cout<<"请输入顶点-顶点-权值:"<<endl;
	for(i=0;i<edge;i++)
	{
		cin>>p1>>p2>>weight;
		InsertEdge(&g,p1,p2,weight,n);
	}
	PrintGraph(&g,n);
	cout<<"输入需要删除的边:"<<endl;
	int e1,e2;
	cin>>e1>>e2;
	DeleteEdge(&g,e1,e2,n);
	cout<<"删除后边的数目为:"<<g.edgenum<<endl;
	system("pause");
}
时间: 2024-10-23 03:19:52

图的邻接矩阵存储结构的相关文章

数据结构(二十九)图的邻接矩阵存储结构

一.邻接矩阵的Java语言代码实现: 二.邻接矩阵的创建C语言代码实现: #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXVEX 10

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

图总结之存储结构代码详解

一.图的存储结构 1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图.一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图. 从上面可以看出,无向图的边数组是一个对称矩阵.所谓对称矩阵就是n阶矩阵的元满足aij = aji.即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都是相等的. 从这个矩阵中,很容易知道图中的信息. (1)要判断任意两顶点是否有

图的邻接矩阵存储

邻接表的构造与邻接矩阵完全不同,同学们应该发现了,邻接表的的结构更像是由几个链表构成的. 在构造邻接表时,我们的确会借助链表的结构.对图中每个顶点的信息,我们都会分别使用一个链表来进行存储. 因此,我们需要初始化一个有 n 个元素的链表数组,n 为图中顶点数量. 我们要在邻接表中存储的图的信息,实际上就是顶点之间存在的有向边. 当从顶点 a 到顶点 b 存在一条有向边时,我们只需要在头结点为 a 的链表后插入一个结点 b. 值得注意的是,当一条边是从顶点 b 到顶点 a 时,我们同样需要在以 b

图的邻接矩阵存储数据结构--自己写数据结构

头文件graph.h #ifndef _GRAPH_H_ #define _GRAPH_H_ #define MAX_VER 100 #define ENDLESS 65535 typedef char VertexType; typedef int EdgeType; typedef struct _Graph { VertexType ver[MAX_VER]; EdgeType edge[MAX_VER][MAX_VER]; int num_ver,num_edge; }Graph,*pG

DS图—图的邻接矩阵存储及度计算

题目描述 假设图用邻接矩阵存储.输入图的顶点信息和边信息,完成邻接矩阵的设置,并计算各顶点的入度.出度和度,并输出图中的孤立点(度为0的顶点) --程序要求-- 若使用C++只能include一个头文件iostream:若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件,不看代码,作0分处理 不允许使用第三方对象或函数实现本题的要求 输入 测试次数T,每组测试数据格式如下: 图类型  顶点数 (D—有向图,U—无向图) 顶点信息 边数 每行一条边(顶点1 顶

_DataStructure_C_Impl:图的邻接矩阵存储

//_DataStructure_C_Impl:邻接矩阵 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 10000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef enum{DG,DN,

图的常用存储结构

一.邻接矩阵 邻接矩阵是简单的也是比较常用的一种表示图的数据结构,对于一个有N个点的图,需要一个N*N的矩阵,这个矩阵的i行第j列的数值表示点vi到点vj的距离.邻接矩阵需要初始化,map[i][i] = 0;map[i][j] = INF(i != j),对于每组读入的数据vi,vj,w(vi为边的起点,vj为边的终点,w为边的权值),赋值map[vi][vj] = w,另外邻接矩阵的值和边的输入顺序无关. 对于邻接矩阵来说,初始化需要O(n^2)的时间,建图需要O(m),所以总时间复杂度是O

Nutch中Web图基本类型和存储结构

类Node表示Web图中节点,基本信息包括:入链数.出链数.入链分数和元数据.出链分数通过入链分数除以出链数得到. 类LinkDatum表示Web图中链接,基本信息包括:链接.锚文本.分数.时间戳和链接类型(出链或入链). 类LinkNode表示链接节点,包括链接和Node两部分. 类LoopSet表示链接构成的环,包含环中的链接集合. Web图由抓取的段(主要是parse-data,可选包括crawl-fetch)生成,包括三部分:出链数据库.入链数据库和节点库. 设Web图所在目录为w,则: