顶点:单位元素数据
边:连接顶点的线段
度:一个节点有几个临界点
顺序存储:1.邻接矩阵,2.边集数组
链式存储:1.邻接表,2.链式前向星
邻接矩阵:
1.使用一个维数字组存储图中所有顶点的信息
2.使用一个二维数组存储途中顶点之间的邻接关系
图分为无向图,有向图,带权图(也叫网)
无向图的边是双向的,没有箭头朝向,但两顶点同时相互指向
有向图的边是单向的,有箭头朝向,两顶点可以相互指向
带权图,在优先图的基础上,每个边都有一个权限
arr[] = {a, d, c, b} 0 1 2 3 存储顶点信息
M[i][j] = M[j][i] = 1
否则M[i][j] = 0
M二维数组 [i][j],i j为两个顶点
二维数组的构成:由一维数组决定,即顶点决定。
如上图,有四个顶点,则行列4*4的二维数组,数组坐标由0 1 2 3决定
存储AD的边:A是0,D是1,则0行1列记为1
存储DA的边:D是1,A是0,则1行0列记为1
同理可得AB AC等等的二维数组中的位置即数值
AA BB CC DD在二维数组中值记为0
由此方法,构造一个二维数组去存储边的关系
在此数组基础下,每一行都代表着一个顶点连接其他边的关系
也可发现,该数组关于对角线对称,由于双向边
无向图的度:二维数组每一行数值之和
arr[] = {a, b, c, d, e} 0 1 2 3 4
一个5*5的二维数组
有向图的度分为入度和出度:
入度:二维数组列的总和,即指向该节点的线段数之和
出度:二维数组行的总和,即该节点指向其他节点线段数之和
M[i][j] = 1,两顶点之间的有向线段
否则M[i][j] = 0,两顶点没有有向线段
存储AB的边:A是0,B是1,则0行1列记为1
存储AE的边:A是0,E是4,则0行4列记为1
存储EB的边:E是4,B是1,则4行1列记为1
如上同理,得出其他边在二维数组的位置及数值,其余的记为0,即没有指向的边
arr[] = {a, b, c, d, e} 0 1 2 3 4
M[i][j] = w(权)
M[i][j] = ∞,在实际变编程中,选择一个极大值如0xFFFFFFFF,当作无穷
存储AB的边:A是0,B是1,权是5,则0行1列记作5
存储AE的边:A是0,E是4,权是9,则0行4列记作9
如上同理,得出其他边在二维数组的位置及数值,其余的记为0xFFFFFFFF
const int maxnode = 1000; 设置一个最大节点数
int arr[maxnode][maxnode]; 设置一个邻接矩阵二维数组
int nCount; 实际节点数
int edge; 实际边数
void Create()
{
int nStart = 0; 启动位置
int nEnd = 0; 结束位置
std::cin >> nCount >> Edge; 设置实际节点数和边数
for(size_t i = 0; i< nCount; i++)
{
for(size_t j = 0; j < nCount; j++)
{
arr[i][j] = 0; 初始化二维数组
}
}
for(size_t i = 0; i < edge; i++)
{
std::cin >> nStart >> nEnd;
arr[nStart][nEnd] = arr[nEnd][nStart] = 1; 有向图此处修改即可
}
}
void print()
{
for(size_t i = 0; i< nCount; i++)
{
for(size_t j = 0; j < nCount; j++)
{
std::cout << arr[i][[j] << "\t"; \t打印四个空格
}
std::coout << std::endl;;
}
每个节点内都有三个成员,分别是边的起点,边的终点和权限
struct Node
{
int nStart;
int nEnd;
int nWeight;
}e[100];设置可以构造一百个结构体,即一百个边
三个成员,八条边,组成一个八行三列数组
三列依次是起点,终点,权限
如第一行即第一条边:AB,起始0,终点1,权限5
如上同理,得出其他边在该多维数组的位置及数值
std::cin >> nCount >> edge;
for(size_t i = 1; i <= edge; i++) 存储图
{
std::cin >> e[i].nStart >> e[i].nEnd >> e[i].nWeight;
}