数据结构cpp版——图结构的存储与输出
图的存储主要分为顺序存储和链式存储
顺序存储的方式主要是邻接矩阵,而链式存储的结构有多种这里主要介绍链式邻接表。
邻接矩阵表示法:
1,建立一个一维数组用来存储图的所有顶点(即建立一个顶点表),建立一个二维数组用来表示各个顶点间是否有边(即建立一个邻接矩阵)
2,假设图A=(V,E)有n个顶点,则图的邻接矩阵是个二维数组A.Edge[n][n]
无向图的邻接矩阵表示法
设i,j∈V 若A.Edge[i][j]=1,则(i,j)∈E,即i j之间存在边,若.Edge[i][j]=0,则i j之间不存在边
分析1:无向图的邻接矩阵是对称的
分析2:顶点i的度=第i行或者第i列所有1的个数
有向图的邻接矩阵表示方法
在有向图邻接矩阵中
第i行表示 以结点vi为尾的边(出度边)
第i列表示 以结点vi为头的边(入度边)
顶点的出度=第i行所有元素之和
顶点的入度=第i列所有元素之和
网(即有权图)的邻接矩阵表示方法
设i,j∈V 若A.Edge[i][j]=W,则(i,j)∈E,即i j之间存在边,且其权值为W,若.Edge[i][j]=∞,则i j之间不存在边
邻接矩阵的优点:容易实现图的操作。比如判断两顶点之间是否有边,求顶点的度,找顶点的邻接点等
缺点:n个顶点需要nn个单元存储边,空间复杂度为O(n*n),如果是稀疏图格外浪费空间。比如如果一个图结构有100顶点但只有10条边,则依旧需要分配10000个存储.
采用邻接矩阵创建无向网
【算法思想】
1,输入总顶点数和总边数
2,输入顶点信息
3,初始化邻接矩阵,使每个权值初始化为极大值
4,输入边信息和对应的权值,构造邻接矩阵。
#include<iostream>
using namespace std;
#define max 9999//设置极大值用来代表∞
#define num 100 //设置最大顶点数
typedef char dingdian;// 设置顶点类型为字符
typedef int quanzhi; //设置权值为整型
typedef struct{
dingdian dd[num];//定义用来存放顶点的数组
quanzhi lj[num][num];//定义用来存放权值的二维数组创建邻接矩阵
int ds,bs;//分别表示该图的 总顶点数和总边数
}Tu;
int look(Tu G,dingdian v)//定义查找顶点对应下标的函数
{
int i;
for(i=0;i<G.ds;i++)
{
if(G.dd[i]==v)
return i;
}
}
int creattu(Tu &G)//定义创建该图的函数
{
int i,j,k;
dingdian v1,v2;
quanzhi w;
cin>>G.ds;cin>>G.bs; //输入总顶点数和总边数
for(i=0;i<G.ds;i