图的邻接矩阵存储结构

图的邻接矩阵存储结构_第1张图片

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

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

概念解析:

第一个邻接顶点:

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

下一个邻接顶点:

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


无向图邻接矩阵的特点:

对角线权值是0

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


代码如下:

#include
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;iweight[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!"<weight[v][w]=weight;
	g->edgenum++;
}

//取得点V的第一个临接顶点
int GetFirstVertex(Graph *g,int v,int n)
{
	if(v<0||v>=n)
	{
		cout<<"overflow"<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"<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"<weight[v][w]=0x7fff;
	g->edgenum--;
}


void PrintGraph(Graph *g,int n)
{
	int y,x,i;
	for(i=0;i>n;
	cout<<"请输入图的边个数"<>edge;
	Initiate_Graph(&g,n);
	int i,p1,p2,weight;
	cout<<"请输入顶点-顶点-权值:"<>p1>>p2>>weight;
		InsertEdge(&g,p1,p2,weight,n);
	}
	PrintGraph(&g,n);
	cout<<"输入需要删除的边:"<>e1>>e2;
	DeleteEdge(&g,e1,e2,n);
	cout<<"删除后边的数目为:"<


你可能感兴趣的:(图论)